home *** CD-ROM | disk | FTP | other *** search
/ Mission 3 / Mission 3.zip / Mission 3.iso / texte / 7up_pd / markblk8.c < prev    next >
C/C++ Source or Header  |  1998-10-29  |  62KB  |  2,327 lines

  1. /*****************************************************************************
  2. *
  3. *                                              7UP
  4. *                                        Modul: MARKBLK.C
  5. *                                     (c) by TheoSoft '90
  6. *
  7. *****************************************************************************/
  8. /**************************************************************************
  9.                           Außen Scrollbereich, innen Fenster.
  10.                               םגגגגגגגגגגגגגגגגגגגגגגגגגגג™
  11.                               ø  םגגגגגגגגגגגגגגגגגגגגג™  ø
  12.                               ø  ø                            ø  ø
  13.                               ø  ø         םגגאגגגגגגגגגגœ  ø
  14.                        ø  בגגגגגגגœ  ø          ø  ø
  15.                               ø  ø         ø  בגגגגגגגגגגœ  ø
  16.                        ø  בגגגגגגגIJגגך          ø  ø
  17.                               ø  ø                            ø  ø
  18.                               ø  ø                            ø  ø
  19.                               ø  ijגגגגגגגגגגגגגגגגגגגגגך  ø
  20.                               ijגגגגגגגגגגגגגגגגגגגגגגגגגגגך
  21.                     So markiert 7UP den Block. Drei Teile.
  22.              Das hat mehrere Wochen Nerven gekostet, bis es lief :-(
  23. **************************************************************************/
  24. #include <portab.h>
  25. #include <stdio.h>
  26. #include <stdlib.h>
  27. #include <string.h>
  28. #include <ctype.h>
  29. #include <aes.h>
  30. /*
  31. #include <vdi.h>
  32. */
  33. #include "7up.h"
  34. #include "windows.h"
  35. #include "undo.h"
  36.  
  37. #define HORIZ_OFFSET 5
  38. #define HALFPAGE      (wp->hwork/wp->hscroll/2)
  39.  
  40. void hide_blk(WINDOW *wp,LINESTRUCT *begcut, LINESTRUCT *endcut);
  41. void free_blk(WINDOW *wp,LINESTRUCT *begcut);
  42. void mark_line(WINDOW *wp, LINESTRUCT *str, int i);
  43. int isgerman(char key);
  44.  
  45. extern LINESTRUCT *lastwstr;
  46. extern long          lasthfirst,begline, endline;
  47. extern int cut;
  48. extern int vdihandle,xdesk,ydesk,wdesk,hdesk;
  49. extern char searchstring[];
  50.  
  51. static int findword(char *string, int x, int *beg, int *end)
  52. {
  53.     register int i,k;
  54.     k=strlen(string);
  55.     *beg=0;
  56.     *end=k;/*STRING_LENGTH;*/
  57.  
  58.     if( ! (!isspace(string[x]) && (isalnum(string[x]) || isgerman(string[x]))))
  59.         return(FALSE);
  60.     for(i=x; i<k; i++)
  61.         if( ! (!isspace(string[i]) && (isalnum(string[i]) || isgerman(string[i]))))
  62.         {
  63.             *end=i;
  64.             break;
  65.         }
  66.     for(i=x; i>=0; i--)
  67.         if( ! (!isspace(string[i]) && (isalnum(string[i]) || isgerman(string[i]))))
  68.         {
  69.             *beg=i+1;
  70.             break;
  71.         }
  72.     if((*end - *beg) > 0)
  73.         return(TRUE);
  74.     else
  75.         return(FALSE);
  76. }
  77.  
  78. int Wdclickword(WINDOW *wp, LINESTRUCT **begcut, LINESTRUCT **endcut, int mx, int my)
  79. {
  80.     register int i,x,y;
  81.     register long line;
  82.     register LINESTRUCT *help;
  83.     int beg,end,ret,nx,ny;
  84.     if(wp)
  85.     {
  86.         if(cut)                    /* gibt es erst noch müll zu löschen */
  87.             free_blk(wp,*begcut);
  88.         else
  89.             hide_blk(wp,*begcut,*endcut);
  90.  
  91.         if(mx>wp->xwork && mx<wp->xwork+wp->wwork-1 &&
  92.             my>wp->ywork && my<wp->ywork+wp->hwork-1)
  93.         {
  94.             graf_mkstate(&nx,&ny,&ret,&ret);
  95.             x=(mx-wp->xwork)/wp->wscroll;
  96.             y=(my-wp->ywork)/wp->hscroll;
  97.             lastwstr=wp->wstr;
  98.             lasthfirst=wp->hfirst;
  99.             begline=y+wp->hfirst/wp->hscroll;
  100.             endline=begline;
  101.             if(begline<wp->hsize/wp->hscroll)
  102.             {
  103.                 for(help=wp->wstr, i=0; help && i<=y; help=help->next, i++)
  104.                     *begcut=*endcut=help;
  105.                 if(findword((*begcut)->string,(int)(x+wp->wfirst/wp->wscroll),&beg,&end))
  106.                 {
  107.                     (*begcut)->begcol=(*endcut)->begcol=beg;
  108.                     (*begcut)->endcol=(*endcut)->endcol=end;
  109.                     (*begcut)->attr=((*endcut)->attr|=SELECTED);
  110.                     graf_mouse(M_OFF,0L);
  111.                     Wcursor(wp);
  112.                     mark_line(wp,*begcut,y);
  113.                     wp->cstr=*begcut;
  114.                     wp->cspos=wp->col=end-wp->wfirst/wp->wscroll;
  115.                     wp->row=y;
  116.                     Wcuroff(wp);
  117.                     Wcursor(wp);
  118.                     graf_mouse(M_ON,0L);
  119.                     strncpy(searchstring,&(*begcut)->string[beg],end-beg);
  120.                     searchstring[end-beg]=0;
  121.                     undo.item=FALSE;
  122. /*
  123. printf("\33H%ld %ld",begline,endline);
  124. */
  125.                /* 28.02.94 */
  126.                     if((*begcut)->begcol==0 && (*begcut)->endcol==wp->cstr->used)
  127.                         endline++; /* ganze Zeile */
  128.  
  129.                     return(TRUE);
  130.                 }
  131.             }
  132.         }
  133.     }
  134.     endline=begline=0L;
  135.     *begcut=*endcut=NULL;
  136.     *searchstring=0;
  137.     return(FALSE);
  138. }
  139.  
  140. void mark_blk(WINDOW *wp,LINESTRUCT **begcut, LINESTRUCT **endcut)
  141. {
  142.     LINESTRUCT *help;
  143.     register int i,y;
  144.  
  145.     graf_mouse(M_OFF,0L);
  146.     Wcursor(wp);
  147.     for(help=wp->wstr,i=0,y=wp->ywork;
  148.          help && y<(wp->ywork+wp->hwork-1);
  149.          help=help->next, i++, y+=wp->hscroll)
  150.     {
  151.         if(help->attr & SELECTED)
  152.             mark_line(wp,help,i);
  153.     }
  154.     Wcuroff(wp);
  155.     Wcursor(wp);
  156.     graf_mouse(M_ON,0L);
  157. }
  158.  
  159. static int find_backward(WINDOW *wp, LINESTRUCT **begcut, LINESTRUCT **endcut, char a, char b)
  160. {
  161.     LINESTRUCT *help;
  162.     register int save,klammer=0;
  163.     register long i;
  164.  
  165.     save=(*endcut)->endcol;
  166.     i=(*endcut)->endcol-1;
  167.     for(help=*endcut; help->prev; help=help->prev, i=help->used-1, begline--)
  168.     {
  169.         for(i; i>=0; i--)
  170.         {
  171.             if(help->string[i]==a)
  172.             {
  173.                 klammer++;
  174.             }
  175.             if(help->string[i]==b)
  176.             {
  177.                 klammer--;
  178.                 if(klammer==0)
  179.                 {
  180.                     *begcut=lastwstr=help;
  181.                     for(help=*begcut; help && help!=(*endcut)->next; help=help->next)
  182.                     {
  183.                         help->begcol=0;
  184.                         help->endcol=STRING_LENGTH;
  185.                         help->attr|=SELECTED;
  186.                     }
  187.                     (*begcut)->endcol=STRING_LENGTH;
  188.                     (*endcut)->begcol=0;
  189.                     (*endcut)->endcol=save;
  190.                     (*begcut)->begcol=i;
  191.                     mark_blk(wp,begcut,endcut);
  192.                     hndl_blkfind(wp,*begcut,*endcut,SEARBEG);
  193.                     lastwstr=wp->wstr;
  194.                     lasthfirst=wp->hfirst;
  195.                 undo.item=FALSE;
  196.                     return(TRUE);
  197.                 }
  198.             }
  199.         }
  200.     }
  201.     return(FALSE);
  202. }
  203.  
  204. static int find_forward(WINDOW *wp, LINESTRUCT **begcut, LINESTRUCT **endcut, char a, char b)
  205. {
  206.     LINESTRUCT *help;
  207.     register int i,save,klammer=0;
  208.  
  209.     save=i=(*begcut)->begcol;
  210.     for(help=*begcut; help; help=help->next, i=0, endline++)
  211.     {
  212.         for(i; i<help->used; i++)
  213.         {
  214.             if(help->string[i]==a)
  215.             {
  216.                 klammer++;
  217.             }
  218.             if(help->string[i]==b)
  219.             {
  220.                 klammer--;
  221.                 if(klammer==0)
  222.                 {
  223.                     *endcut=help;
  224.                     for(help=*begcut; help!=(*endcut)->next; help=help->next)
  225.                     {
  226.                         help->begcol=0;
  227.                         help->endcol=STRING_LENGTH;
  228.                         help->attr|=SELECTED;
  229.                     }
  230.                     (*begcut)->endcol=STRING_LENGTH;
  231.                     (*endcut)->begcol=0;
  232.                     (*begcut)->begcol=save;
  233.                     (*endcut)->endcol=i+1;
  234.                     mark_blk(wp,begcut,endcut);
  235.                     hndl_blkfind(wp,*begcut,*endcut,SEAREND);
  236.                  undo.item=FALSE;
  237.                     return(TRUE);
  238.                 }
  239.             }
  240.         }
  241.     }
  242.     return(FALSE);
  243. }
  244.  
  245. int Wdclickbrace(WINDOW *wp, LINESTRUCT **begcut, LINESTRUCT **endcut, int mx, int my)
  246. {
  247.     register long i;
  248.     int y,found=0,ret,key_state,klammer=0;
  249.     register LINESTRUCT *line,*help;
  250.     unsigned char c;
  251.  
  252.     if(wp)
  253.     {
  254.         if(cut)                    /* gibt es erst noch müll zu löschen */
  255.             free_blk(wp,*begcut);
  256.         else
  257.             hide_blk(wp,*begcut,*endcut);
  258.  
  259.         if(mx>wp->xwork && mx<wp->xwork+wp->wwork-1 &&
  260.             my>wp->ywork && my<wp->ywork+wp->hwork-1)
  261.         {
  262.             lastwstr=wp->wstr;
  263.             lasthfirst=wp->hfirst;
  264.  
  265.             y=(my-wp->ywork)/wp->hscroll;
  266.             if(y>=wp->hsize/wp->hscroll)/* wenn unterhalb der letzten Zeile angesetzt */
  267.                 return(FALSE);
  268.  
  269.             begline=endline=y+wp->hfirst/wp->hscroll;
  270.  
  271.             for(i=0, help=wp->wstr; i<y && help; i++, help=help->next)
  272.               ;
  273.             *begcut=*endcut=help;
  274.  
  275.             /* Zeichen unter Maus suchen */
  276.             c=help->string[(mx-wp->xwork)/wp->wscroll+wp->wfirst/wp->wscroll];
  277.             if((mx-wp->xwork)/wp->wscroll+wp->wfirst/wp->wscroll >= help->used)
  278.                 c=0; /* hinter dem Stringende */
  279.  
  280.             (*begcut)->begcol=(mx-wp->xwork)/wp->wscroll+wp->wfirst/wp->wscroll;
  281.             (*endcut)->endcol=(*begcut)->begcol+1;
  282.  
  283.             switch(c)
  284.             {
  285.                 case '(':
  286.                     if(find_forward(wp,begcut,endcut,c,')'))
  287.                     {
  288.                         return(TRUE);
  289.                     }
  290.                     break;
  291.                 case '{':
  292.                     if(find_forward(wp,begcut,endcut,c,'}'))
  293.                     {
  294.                         return(TRUE);
  295.                     }
  296.                     break;
  297.                 case '[':
  298.                     if(find_forward(wp,begcut,endcut,c,']'))
  299.                     {
  300.                         return(TRUE);
  301.                     }
  302.                     break;
  303.                 case '<':
  304.                     if(find_forward(wp,begcut,endcut,c,'>'))
  305.                     {
  306.                         return(TRUE);
  307.                     }
  308.                     break;
  309.                 case ')':
  310.                     if(find_backward(wp,begcut,endcut,c,'('))
  311.                     {
  312.                         return(TRUE);
  313.                     }
  314.                     break;
  315.                 case '}':
  316.                     if(find_backward(wp,begcut,endcut,c,'{'))
  317.                     {
  318.                         return(TRUE);
  319.                     }
  320.                     break;
  321.                 case ']':
  322.                     if(find_backward(wp,begcut,endcut,c,'['))
  323.                     {
  324.                         return(TRUE);
  325.                     }
  326.                     break;
  327.                 case '>':
  328.                     if(find_backward(wp,begcut,endcut,c,'<'))
  329.                     {
  330.                         return(TRUE);
  331.                     }
  332.                     break;
  333.                 default:
  334.                     for(line=help; line; line=line->prev, begline--)
  335.                     {
  336.                         if(strchr(line->string,'}'))
  337.                         {
  338.                             klammer++;
  339.                             continue;  /* weiter mit for */
  340.                         }
  341.                         if(strchr(line->string,'{'))
  342.                         {
  343.                             klammer--;
  344.                             if(klammer==-1)
  345.                             {
  346.                                 *begcut=lastwstr=line;
  347.                                 found++;
  348.                                 break;
  349.                             }
  350.                         }
  351.                     }
  352.                     klammer=0;
  353.                     for(line=help->next; line; line=line->next, endline++)
  354.                     {
  355.                         if(strchr(line->string,'{'))
  356.                         {
  357.                             klammer++;
  358.                             continue;  /* weiter mit for */
  359.                         }
  360.                         if(strchr(line->string,'}'))
  361.                         {
  362.                             klammer--;
  363.                             if(klammer==-1)
  364.                             {
  365.                                 *endcut=line;
  366.                                 found++;
  367.                                 break;
  368.                             }
  369.                         }
  370.                     }
  371.                     graf_mkstate(&ret, &ret, &ret, &key_state);
  372.                     if(found==2 && (key_state & K_CTRL))
  373.                     {
  374.                         (*begcut)=(*begcut)->next;
  375.                         begline++;
  376.                         (*endcut)=(*endcut)->prev;
  377.                         endline--;
  378.                         if(endline<begline)
  379.                             found=0;
  380.                     }
  381.                     if(found==2)
  382.                     {
  383.                         for(help=*begcut; help!=(*endcut)->next; help=help->next)
  384.                         {
  385.                             help->begcol=0;
  386.                             help->endcol=STRING_LENGTH;
  387.                             help->attr|=SELECTED;
  388.                         }
  389.                         mark_blk(wp,begcut,endcut);
  390.  
  391.                         /* BEGLINE und LASTHFIRST setzen */
  392.                         for(help=wp->fstr, i=0;
  393.                              help && help!=wp->wstr;
  394.                              help=help->next, i++)
  395.                             if(help==*begcut)
  396.                             {
  397.                                 lastwstr=help;
  398.                                 lasthfirst=i*wp->hscroll;
  399.                                 begline=i;
  400.                             }
  401.                    undo.item=FALSE;
  402.                         return(TRUE);
  403.                     }
  404.                     break;
  405.             }
  406.         }
  407.     }
  408.     endline=begline=0L;
  409.     *begcut=*endcut=NULL;
  410.     *searchstring=0;
  411.     return(FALSE);
  412. }
  413.  
  414. int Wdclickline(WINDOW *wp, LINESTRUCT **begcut, LINESTRUCT **endcut, int mx, int my)
  415. {
  416.     register int i,x,y;
  417.     register long line;
  418.     register LINESTRUCT *help;
  419.     if(wp)
  420.     {
  421.         if(cut)                    /* gibt es erst noch müll zu löschen */
  422.             free_blk(wp,*begcut);
  423.         else
  424.             hide_blk(wp,*begcut,*endcut);
  425.  
  426.         if(mx>wp->xwork && mx<wp->xwork+wp->wwork-1 &&
  427.             my>wp->ywork && my<wp->ywork+wp->hwork-1)
  428.         {
  429.             x=(mx-wp->xwork)/wp->wscroll;
  430.             y=(my-wp->ywork)/wp->hscroll;
  431.             lastwstr=wp->wstr;
  432.             lasthfirst=wp->hfirst;
  433.             begline=y+wp->hfirst/wp->hscroll;
  434.             endline=begline+1;
  435.             if(begline<wp->hsize/wp->hscroll)
  436.             {
  437.                 for(help=wp->wstr, i=0; help && i<=y; help=help->next, i++)
  438.                     *begcut=*endcut=help;
  439.                 (*begcut)->begcol=(*endcut)->begcol=0;
  440.                 if(wp->w_state & COLUMN)
  441.                     (*begcut)->endcol=(*endcut)->endcol=(*begcut)->used;
  442.                 else
  443.                     (*begcut)->endcol=(*endcut)->endcol=STRING_LENGTH;
  444.                 (*begcut)->attr=((*endcut)->attr|=SELECTED);
  445.                 graf_mouse(M_OFF,0L);
  446.                 Wcursor(wp);
  447.                 mark_line(wp,*begcut,y);
  448.                 wp->cstr=*begcut;
  449.                 wp->cspos=wp->col=x;
  450.                 wp->row=y;
  451.                 Wcuroff(wp);
  452.                 Wcursor(wp);
  453.                 graf_mouse(M_ON,0L);
  454.                 undo.item=FALSE;
  455.                 return(TRUE);
  456.             }
  457.         }
  458.     }
  459.     endline=begline=0L;
  460.     *begcut=*endcut=NULL;
  461.     *searchstring=0;
  462.     return(FALSE);
  463. }
  464.  
  465. int find_end_of_word(char *str, int x, int len)
  466. {
  467.     register int i;
  468.  
  469.     for(i=x; i<len; i++)
  470.     {
  471.         if(!inw(str[i]) && (inw(str[i+1]) || str[i+1]==0))
  472.             return(i+1);
  473.     }
  474.     return(len);
  475. }
  476.  
  477. int find_beg_of_word(char *str, int x, int len)
  478. {
  479.     register int i;
  480.  
  481.     for(i=x; i>0; i--)
  482.     {
  483.         if(!inw(str[i]) && inw(str[i-1]))
  484.             return(i);
  485.     }
  486.     return(0);
  487. }
  488.  
  489. static void blackbox(WINDOW *wp, int rect[], int cw)
  490. {
  491.     int area[4],full[4],pxyarray[4];
  492.  
  493.     if(rect[2]>=cw)
  494.     {
  495.         graf_mouse(M_OFF,0L);
  496.         wind_update(BEG_UPDATE);
  497.         _wind_get(0, WF_WORKXYWH, &full[0], &full[1], &full[2], &full[3]);
  498.         _wind_get(wp->wihandle, WF_FIRSTXYWH, &area[0], &area[1], &area[2], &area[3]);
  499.         while( area[2] && area[3] )
  500.         {
  501.             if(rc_intersect(full,area))
  502.             {
  503.                 if(rc_intersect(rect,area))
  504.                 {
  505.                     if(rc_intersect(&wp->xwork,area)) /* 26.5.94 wg. Toolbar */
  506.                     {
  507.                         pxyarray[0]=area[0];
  508.                         pxyarray[1]=area[1];
  509.                         pxyarray[2]=area[0]+area[2]-1;
  510.                         pxyarray[3]=area[1]+area[3]-1;
  511.                         vs_clip(vdihandle,TRUE,pxyarray);
  512.                         vr_recfl(vdihandle,pxyarray);        /* markieren */
  513.                     }
  514.                 }
  515.             }
  516.             _wind_get(wp->wihandle, WF_NEXTXYWH, &area[0], &area[1], &area[2], &area[3]);
  517.         }
  518.         wind_update(END_UPDATE);
  519. /*
  520.         vs_clip(vdihandle,FALSE,pxyarray);
  521. */
  522.         graf_mouse(M_ON,0L);
  523.     }
  524. }
  525.  
  526. void swap(int *a, int *b)
  527. {
  528.     int hilf;
  529.     hilf=*a;
  530.     *a  =*b;
  531.     *b  =hilf;
  532. }
  533. /*
  534. Wenn Shifttaste gedrückt, markierten Block nicht löschen. Falls Block
  535. schon gecutet ist, Puffer löschen. Erweitern ist dann auch nicht möglich.
  536. Erweiterung des Blocks bei gedrückter Shifttaste.
  537. */
  538. int _Wmarkblock(WINDOW *wp, LINESTRUCT **begcut, LINESTRUCT **endcut, int e_mx, int e_my, int clicks, int key_state)
  539. {
  540.     int ret,fx,fy,x,y,x2,oldx,oldy,pxyarray[4];
  541.     int mx,my,mouse_click,wordmark=FALSE,linemark=FALSE;
  542.     int bbcsave,becsave,ebcsave,eecsave;
  543.     register LINESTRUCT *line,*help;
  544.     int xout,yout,wout,hout;
  545.     long i,y2,temp;
  546.  
  547.     if(wp)
  548.     {
  549.         switch(clicks) /* Klicken zählen */
  550.         {
  551.             case 1:
  552.                 break;
  553.             case 2:
  554.                 wordmark=TRUE;
  555.                 break;
  556.             case 3:
  557.                 linemark=TRUE;
  558.                 break;
  559.         }
  560.         if(key_state & K_CTRL && !(key_state & K_ALT))
  561.             wordmark=TRUE;
  562.         if(key_state & K_ALT && !(key_state & K_CTRL))
  563.             linemark=TRUE;
  564.  
  565.         if((clicks>1)||
  566.             !(!cut && *begcut && *endcut && (key_state & (K_RSHIFT|K_LSHIFT))))
  567.         {  /* es liegt keine Blockerweiterung vor per Shifttaste vor */
  568.             graf_mkstate(&mx, &my, &mouse_click, &ret);
  569.             if(!mouse_click)
  570.                 return(FALSE);
  571.             for(i=0; i<4; i++)
  572.             {
  573.                 evnt_timer(25,0);  /* 4 x 25ms warten */
  574.                 graf_mkstate(&mx, &my, &mouse_click, &ret);
  575.                 if(!mouse_click)
  576.                     return(FALSE);
  577.             }
  578.         }
  579.                           /* bei gedrückter Shifttaste Block erweitern */
  580.         if(!cut && !(key_state & (K_RSHIFT|K_LSHIFT)))
  581.             hide_blk(wp,*begcut,*endcut);
  582.         if(cut)                    /* gibt es erst noch müll zu löschen */
  583.             free_blk(wp,*begcut);
  584.  
  585.         wind_calc(WC_BORDER,wp->kind,wp->xwork,wp->ywork,wp->wwork,wp->hwork,
  586.             &xout,&yout,&wout,&hout);
  587.  
  588.         mx=e_mx;
  589.         my=e_my;
  590.  
  591.         if(!(mx >= wp->xwork && mx <= (wp->xwork + wp->wwork - 1) &&
  592.             my >= wp->ywork && my <= (wp->ywork + wp->hwork - 1)))
  593.         {
  594.             return(FALSE);
  595.         }
  596.  
  597.         x=(mx-wp->xwork)/wp->wscroll;
  598.         if(((mx-wp->xwork)%wp->wscroll) >= wp->wscroll/2)
  599.             x++;
  600.         fx=oldx=x;
  601.         fy=oldy=y=(my-wp->ywork)/wp->hscroll;
  602.  
  603.         if(y>=wp->hsize/wp->hscroll)/* wenn unterhalb der letzten Zeile angesetzt */
  604.         {
  605.             return(FALSE);
  606.         }
  607.  
  608.         for(i=0, line=wp->wstr; i<y && line; i++, line=line->next)
  609.           ;
  610.  
  611.         lastwstr=wp->wstr;
  612.         lasthfirst=wp->hfirst;
  613.         wind_update(BEG_MCTRL);
  614.         if(!(wp->w_state&COLUMN))
  615.         {
  616.             oldx=x=min(x,line->used-wp->wfirst/wp->wscroll);
  617. /*
  618.             if(x>line->used-wp->wfirst/wp->wscroll)
  619.                 oldx=x=line->used-wp->wfirst/wp->wscroll;
  620. */
  621.             y2=(my-wp->ywork)/wp->hscroll+wp->hfirst/wp->hscroll;
  622.             if(!cut && *begcut && *endcut && (key_state & (K_RSHIFT|K_LSHIFT)))
  623.             {
  624.                 if((y2 > (begline+(endline-begline)/2)) ||
  625.                     ((y2 == (begline+(endline-begline)/2)) && x>((*begcut)->begcol-wp->wfirst/wp->wscroll)))
  626.                 {  /* bereits vorhandenen Block nach unten erweitern */
  627.                     lastwstr=(*begcut);
  628.                     lasthfirst=begline*wp->hscroll;
  629.                     (*begcut)->endcol=STRING_LENGTH;
  630.                     for(help=(*begcut)->next; help && help!=line->next; help=help->next)
  631.                     {
  632.                         help->attr|=SELECTED;
  633.                         help->begcol=0;
  634.                         help->endcol=STRING_LENGTH;
  635.                     }
  636.                     for(help=line->next; help; help=help->next)
  637.                     {
  638.                         help->attr&=~SELECTED;
  639.                     }
  640.                     bbcsave=(*begcut)->begcol;    /* erste spalte */
  641.                     becsave=line->endcol=min(line->used,(int)(x+wp->wfirst/wp->wscroll));
  642.                     pxyarray[0]=wp->xwork;
  643.                     pxyarray[1]=wp->ywork+(min(y2,endline)*wp->hscroll)-wp->hfirst;
  644.                     pxyarray[2]=wp->wwork;
  645.                     pxyarray[3]=(abs(y2-endline)+1)*wp->hscroll;
  646.                 }
  647.                 else
  648.                 {  /* bereits vorhandenen Block nach oben erweitern */
  649.                     lastwstr=wp->wstr;
  650.                     lasthfirst=wp->hfirst;
  651.                     bbcsave=becsave=(*endcut)->endcol;
  652.                     becsave++;
  653.                     *begcut=*endcut;
  654.                     (*begcut)->begcol=0;
  655.                     (*begcut)->endcol=bbcsave;
  656.                     *endcut=line;
  657.                     (*endcut)->begcol=min(line->used,(int)(x+wp->wfirst/wp->wscroll));
  658.                     (*endcut)->endcol=STRING_LENGTH;
  659.                     temp=begline;
  660.                     begline=endline;
  661.                     for(help=wp->fstr; help && help!=line; help=help->next)
  662.                     {
  663.                         help->attr&=~SELECTED;
  664.                     }
  665.                     for(help=(*endcut); help && help!=(*begcut); help=help->next)
  666.                     {
  667.                         help->attr|=SELECTED;
  668.                         help->begcol=0;
  669.                         help->endcol=STRING_LENGTH;
  670.                     }
  671.                     for(help=(*begcut)->next; help; help=help->next)
  672.                     {
  673.                         help->attr&=~SELECTED;
  674.                     }
  675.                     (*endcut)->begcol=min(line->used,(int)(x+wp->wfirst/wp->wscroll));
  676.                     (*begcut)->endcol=bbcsave;
  677.                     pxyarray[0]=wp->xwork;
  678.                     pxyarray[1]=wp->ywork+(min(y2,temp)*wp->hscroll)-wp->hfirst;
  679.                     pxyarray[2]=wp->wwork;
  680.                     pxyarray[3]=(abs(y2-temp)+1)*wp->hscroll;
  681.                 }
  682.                 if(wordmark)  /* wortweise markieren */
  683.                 {
  684.                     if(y+wp->hfirst/wp->hscroll>begline)
  685.                     {
  686.                         becsave=line->endcol=find_end_of_word(line->string,(int)(x+(int)(wp->wfirst/wp->wscroll)), line->used);
  687.                         oldx=x=line->endcol-wp->wfirst/wp->wscroll;
  688.                         goto WEITER3;
  689.                     }
  690.                     if(y+wp->hfirst/wp->hscroll==begline && x>bbcsave)
  691.                     {
  692.                         becsave=line->endcol=find_end_of_word(line->string,(int)(x+(int)(wp->wfirst/wp->wscroll)), line->used);
  693.                         oldx=x=line->endcol-wp->wfirst/wp->wscroll;
  694.                         goto WEITER3;
  695.                     }
  696.                     if(y+wp->hfirst/wp->hscroll==begline && x<bbcsave)
  697.                     {
  698.                         line->begcol=find_beg_of_word(line->string,(int)(x+(int)(wp->wfirst/wp->wscroll)), line->used);
  699.                         oldx=x=line->begcol-wp->wfirst/wp->wscroll;
  700.                         goto WEITER3;
  701.                     }
  702.                     if(y+wp->hfirst/wp->hscroll<begline)
  703.                     {
  704.                         line->begcol=find_beg_of_word(line->string,(int)(x+(int)(wp->wfirst/wp->wscroll)), line->used);
  705.                         oldx=x=line->begcol-wp->wfirst/wp->wscroll;
  706.                     }
  707. WEITER3:         ;
  708.                 }
  709.                 if(linemark)  /* zeilenweise markieren */
  710.                 {
  711.                     if(y+wp->hfirst/wp->hscroll<begline)
  712.                     {
  713.                         oldx=x=0;
  714.                         line->begcol=0;
  715.                         line->endcol=STRING_LENGTH;
  716.                         goto WEITER4;
  717.                     }
  718.                     if(y+wp->hfirst/wp->hscroll==begline)
  719.                     {
  720.                         line->begcol=bbcsave=0;
  721.                         line->endcol=oldx=x=STRING_LENGTH;
  722.                         goto WEITER4;
  723.                     }
  724.                     if(y+wp->hfirst/wp->hscroll>begline)
  725.                     {
  726.                         line->begcol=0;
  727.                         line->endcol=oldx=x=STRING_LENGTH;
  728.                     }
  729. WEITER4:         ;
  730.                 }
  731.                 graf_mouse(M_OFF,0L);
  732.                 Wcursor(wp);
  733.                 Wredraw(wp,pxyarray);
  734.                 Wcursor(wp);
  735.                 graf_mouse(M_ON,0L);
  736.             }
  737.             else
  738.             {
  739.                 if(!cut)
  740.                     hide_blk(wp,*begcut,*endcut);
  741.                 line->attr|=SELECTED; /* nochmal */
  742.                 bbcsave=line->begcol=(int)(x+wp->wfirst/wp->wscroll);    /* erste spalte */
  743.                 becsave=line->endcol=(int)(x+wp->wfirst/wp->wscroll+1);
  744.                 *begcut=line;                                     /* blk beginn */
  745.                 begline=y+wp->hfirst/wp->hscroll;          /* erste zeile */
  746.             }
  747.             graf_mouse(M_OFF,0L);
  748.             Wcursor(wp);
  749.             graf_mouse(M_ON,0L);
  750.             graf_mouse(TEXT_CRSR,NULL);
  751.  
  752.             if(wordmark)
  753.             {
  754.                 if(!(key_state & (K_RSHIFT|K_LSHIFT)))
  755.                 {
  756.                     bbcsave=find_beg_of_word(line->string,(int)(x+(int)(wp->wfirst/wp->wscroll)), line->used);
  757.                     (*begcut)->begcol=line->begcol=bbcsave;
  758.                     oldx=x=bbcsave-wp->wfirst/wp->wscroll;
  759.                 }
  760.             }
  761.             if(linemark)
  762.             {
  763.                 if(!(key_state & (K_RSHIFT|K_LSHIFT)))
  764.                 {
  765.                     bbcsave=0;
  766.                     (*begcut)->begcol=line->begcol=bbcsave;
  767.                     oldx=x=bbcsave-wp->wfirst/wp->wscroll;
  768.                 }
  769.             }
  770.  
  771.             do
  772.             {
  773.                 x=(mx - wp->xwork) / wp->wscroll;
  774.                 if(((mx-wp->xwork)%wp->wscroll) >= wp->wscroll/2)
  775.                     x++;
  776.                 y=(my - wp->ywork) / wp->hscroll;
  777.  
  778.                 x=min(x,line->used-wp->wfirst/wp->wscroll);
  779.                 x=max(0,x);
  780.                 y=max(0,y);
  781.                 x=min(x,wp->wwork/wp->wscroll-1);
  782.                 y=min(y,wp->hwork/wp->hscroll-1);
  783.                 y=min(y,wp->hsize/wp->hscroll-1);
  784.  
  785.                 if(y < oldy)
  786.                 {
  787.                     for(i=y; i<oldy; i++)
  788.                     {
  789.                         if(line->prev)
  790.                         {
  791.                             if(line==*begcut)                  /* Blockbeginn */
  792.                             {
  793.                                 line->begcol=0;
  794.                                 line->endcol=bbcsave;
  795.                                 line=line->prev;
  796.                                 line->attr|=SELECTED;
  797.                                 line->begcol=(int)(x+(int)(wp->wfirst/wp->wscroll));
  798.                                 line->endcol=STRING_LENGTH;
  799.                             }
  800.                             else
  801.                             {
  802.                                 if(line->prev->attr & SELECTED)    /* hinter Bb zurück */
  803.                                 {
  804.                                     line->attr&=~SELECTED;
  805.                                     line=line->prev;
  806.                                     if(line==*begcut)         /* jetzt am Bb */
  807.                                     {
  808.                                         line->begcol=bbcsave;
  809.                                         line->endcol=(int)(x+(int)(wp->wfirst/wp->wscroll));
  810.                                         if(line->begcol>line->endcol)
  811.                                             swap(&line->begcol,&line->endcol);
  812.                                     }
  813.                                     else
  814.                                     {
  815.                                         line->begcol=0;
  816.                                         line->endcol=(int)(x+(int)(wp->wfirst/wp->wscroll));
  817.                                     }
  818.                                 }
  819.                                 else                              /* vor Bb zurück */
  820.                                 {
  821.                                     line->begcol=0;
  822.                                     line->endcol=STRING_LENGTH;
  823.                                     line=line->prev;
  824.                                     line->attr|=SELECTED;
  825.                                     line->begcol=(int)(x+(int)(wp->wfirst/wp->wscroll));
  826.                                     line->endcol=STRING_LENGTH;
  827.                                 }
  828.                             }
  829.                         }
  830.                     }
  831.                 }
  832.                 if(y > oldy)
  833.                 {
  834.                     for(i=oldy; i<y; i++)
  835.                     {
  836.                         if(line->next)
  837.                         {
  838.                             if(line==*begcut) /* Blockbeginn */
  839.                             {
  840.                                 line->begcol=bbcsave;
  841.                                 line->endcol=STRING_LENGTH;
  842.                                 line=line->next;
  843.                                 line->attr|=SELECTED;
  844.                                 line->begcol=0;
  845.                                 line->endcol=(int)(x+(int)(wp->wfirst/wp->wscroll));
  846.                             }
  847.                             else
  848.                             {
  849.                                 if(line->next->attr & SELECTED)  /* vor Blockbeginn */
  850.                                 {
  851.                                     line->attr&=~SELECTED;
  852.                                     line=line->next;
  853.                                     if(line==*begcut)        /* jetzt am Bb */
  854.                                     {
  855.                                         line->begcol=bbcsave;
  856.                                         line->endcol=(int)(x+(int)(wp->wfirst/wp->wscroll));
  857.                                         if(line->begcol>line->endcol)
  858.                                             swap(&line->begcol,&line->endcol);
  859.                                     }
  860.                                     else                         /* immer noch vor Bb */
  861.                                     {
  862.                                         line->begcol=(int)(x+(int)(wp->wfirst/wp->wscroll));
  863.                                         line->endcol=STRING_LENGTH;
  864.                                     }
  865.                                 }
  866.                                 else                             /* nach Blockbeginn */
  867.                                 {
  868.                                     line->begcol=0;
  869.                                     line->endcol=STRING_LENGTH;
  870.                                     line=line->next;
  871.                                     line->attr|=SELECTED;
  872.                                     line->begcol=0;
  873.                                     line->endcol=(int)(x+(int)(wp->wfirst/wp->wscroll));
  874.                                 }
  875.                             }
  876.                         }
  877.                     }
  878.                 }
  879.                 if(wordmark && x!=oldx)  /* wortweise markieren */
  880.                 {
  881.                     if(y+wp->hfirst/wp->hscroll>begline)
  882.                     {
  883.                         line->endcol=find_end_of_word(line->string,(int)(x+(int)(wp->wfirst/wp->wscroll)), line->used);
  884.                         x=line->endcol-wp->wfirst/wp->wscroll;
  885.                         goto WEITER;
  886.                     }
  887.                     if(y+wp->hfirst/wp->hscroll==begline && x>bbcsave)
  888.                     {
  889.                         line->endcol=find_end_of_word(line->string,(int)(x+(int)(wp->wfirst/wp->wscroll)), line->used);
  890.                         x=line->endcol-wp->wfirst/wp->wscroll;
  891.                         goto WEITER;
  892.                     }
  893.                     if(y+wp->hfirst/wp->hscroll==begline && x<bbcsave)
  894.                     {
  895.                         line->begcol=find_beg_of_word(line->string,(int)(x+(int)(wp->wfirst/wp->wscroll)), line->used);
  896.                         x=line->begcol-wp->wfirst/wp->wscroll;
  897.                         goto WEITER;
  898.                     }
  899.                     if(y+wp->hfirst/wp->hscroll<begline)
  900.                     {
  901.                         line->begcol=find_beg_of_word(line->string,(int)(x+(int)(wp->wfirst/wp->wscroll)), line->used);
  902.                         x=line->begcol-wp->wfirst/wp->wscroll;
  903.                     }
  904. WEITER:          ;
  905.                 }
  906.                 if(linemark)  /* zeilenweise markieren */
  907.                 {
  908.                     if(y+wp->hfirst/wp->hscroll<begline)
  909.                     {
  910.                         x=0;
  911.                         line->begcol=0;
  912.                         line->endcol=0;
  913.                         goto WEITER2;
  914.                     }
  915.                     if(y+wp->hfirst/wp->hscroll>=begline)
  916.                     {
  917.                         line->begcol=0;
  918.                         line->endcol=x=STRING_LENGTH;
  919.                     }
  920. WEITER2:         ;
  921.                 }
  922.                 if(y < oldy)
  923.                 {
  924.                     if(x>=oldx)
  925.                     {
  926.                         pxyarray[0]=wp->xwork + x * wp->wscroll;
  927.                         pxyarray[1]=wp->ywork + y * wp->hscroll;
  928.                         pxyarray[2]=wp->wwork;
  929.                         pxyarray[3]=abs(oldy - y) * wp->hscroll;
  930.                         blackbox(wp, pxyarray, wp->wscroll);
  931.                         pxyarray[0]=wp->xwork;
  932.                         pxyarray[1]=wp->ywork + (y+1) * wp->hscroll;
  933.                         pxyarray[2]=oldx * wp->wscroll;
  934.                         pxyarray[3]=abs(oldy- y) * wp->hscroll;
  935.                         blackbox(wp, pxyarray, wp->wscroll);
  936.                     }
  937.                     else /* kleiner */
  938.                     {
  939.                         pxyarray[0]=wp->xwork + oldx * wp->wscroll;
  940.                         pxyarray[1]=wp->ywork + y * wp->hscroll;
  941.                         pxyarray[2]=wp->wwork;
  942.                         pxyarray[3]=abs(oldy - y) * wp->hscroll;
  943.                         blackbox(wp, pxyarray, wp->wscroll);
  944.                         pxyarray[0]=wp->xwork;
  945.                         pxyarray[1]=wp->ywork + (y+1) * wp->hscroll;
  946.                         pxyarray[2]=x * wp->wscroll;
  947.                         pxyarray[3]=abs(oldy- y) * wp->hscroll;
  948.                         blackbox(wp, pxyarray, wp->wscroll);
  949.                     }
  950.                 }
  951.                 if(y > oldy)
  952.                 {
  953.                     if(x >= oldx)
  954.                     {
  955.                         pxyarray[0]=wp->xwork + x * wp->wscroll;
  956.                         pxyarray[1]=wp->ywork + oldy * wp->hscroll;
  957.                         pxyarray[2]=wp->wwork;
  958.                         pxyarray[3]=abs(y - oldy) * wp->hscroll;
  959.                         blackbox(wp, pxyarray, wp->wscroll);
  960.                         pxyarray[0]=wp->xwork;
  961.                         pxyarray[1]=wp->ywork + (oldy + 1) * wp->hscroll;
  962.                         pxyarray[2]=oldx * wp->wscroll;
  963.                         pxyarray[3]=abs(y - oldy) * wp->hscroll;
  964.                         blackbox(wp, pxyarray, wp->wscroll);
  965.                     }
  966.                     else /* kleiner */
  967.                     {
  968.                         pxyarray[0]=wp->xwork + oldx * wp->wscroll;
  969.                         pxyarray[1]=wp->ywork + oldy * wp->hscroll;
  970.                         pxyarray[2]=wp->wwork;
  971.                         pxyarray[3]=abs(y - oldy) * wp->hscroll;
  972.                         blackbox(wp, pxyarray, wp->wscroll);
  973.                         pxyarray[0]=wp->xwork;
  974.                         pxyarray[1]=wp->ywork + (oldy + 1) * wp->hscroll;
  975.                         pxyarray[2]=x * wp->wscroll;
  976.                         pxyarray[3]=abs(y - oldy) * wp->hscroll;
  977.                         blackbox(wp, pxyarray, wp->wscroll);
  978.                     }
  979.                 }
  980.                 if(x > oldx)
  981.                 {
  982.                     if(y>=oldy)
  983.                     {
  984.                         pxyarray[0]=wp->xwork + oldx * wp->wscroll;
  985.                         pxyarray[1]=wp->ywork + oldy * wp->hscroll;
  986.                         pxyarray[2]=abs(x - oldx) * wp->wscroll;
  987.                         pxyarray[3]=(abs(y - oldy)+1) * wp->hscroll;
  988.                         blackbox(wp, pxyarray, wp->wscroll);
  989.                     }
  990.                     else
  991.                     {
  992.                         pxyarray[0]=wp->xwork + oldx * wp->wscroll;
  993.                         pxyarray[1]=wp->ywork + (y+1) * wp->hscroll;
  994.                         pxyarray[2]=abs(x - oldx) * wp->wscroll;
  995.                         pxyarray[3]=(abs(y - oldy)-1) * wp->hscroll;
  996.                         blackbox(wp, pxyarray, wp->wscroll);
  997.                     }
  998.                 }
  999.                 if(x < oldx)
  1000.                 {
  1001.                     if(y==oldy)
  1002.                     {
  1003.                         pxyarray[0]=wp->xwork + x * wp->wscroll;
  1004.                         pxyarray[1]=wp->ywork + y * wp->hscroll;
  1005.                         pxyarray[2]=abs(oldx - x) * wp->wscroll;
  1006.                         pxyarray[3]=wp->hscroll;
  1007.                         blackbox(wp, pxyarray, wp->wscroll);
  1008.                     }
  1009.                     if(y>oldy)
  1010.                     {
  1011.                         pxyarray[0]=wp->xwork + x * wp->wscroll;
  1012.                         pxyarray[1]=wp->ywork + (oldy+1) * wp->hscroll;
  1013.                         pxyarray[2]=abs(oldx - x) * wp->wscroll;
  1014.                         pxyarray[3]=(abs(oldy - y)-1) * wp->hscroll;
  1015.                         blackbox(wp, pxyarray, wp->wscroll);
  1016.                     }
  1017.                     if(y<oldy)
  1018.                     {
  1019.                         pxyarray[0]=wp->xwork + x * wp->wscroll;
  1020.                         pxyarray[1]=wp->ywork + y * wp->hscroll;
  1021.                         pxyarray[2]=abs(x - oldx) * wp->wscroll;
  1022.                         pxyarray[3]=(abs(y - oldy)+1) * wp->hscroll;
  1023.                         blackbox(wp, pxyarray, wp->wscroll);
  1024.                     }
  1025.                 }
  1026.                 oldx=x;
  1027.                 oldy=y;
  1028.                 graf_mkstate(&mx, &my, &mouse_click, &key_state);
  1029.                 if(my < wp->ywork)
  1030.                 {
  1031.                     graf_mouse(M_OFF,0L);
  1032.                     if(Warrow(wp,WA_UPLINE))
  1033.                     {
  1034.                         oldy++;
  1035.                     }
  1036.                     if(my>yout)                    /* Verzögern wenn, auf Fensterrand */
  1037.                         evnt_timer(62,0);
  1038.                     else
  1039.                         if(mouse_click & 2) /* bei rechter Taste 2x */
  1040.                             for(i=0; i<HALFPAGE; i++)
  1041.                                 if(Warrow(wp,WA_UPLINE))
  1042.                                 {
  1043.                                     oldy++;
  1044.                                 }
  1045.                     graf_mouse(M_ON,0L);
  1046.                 }
  1047.                 if(my > (wp->ywork + wp->hwork))
  1048.                 {
  1049.                     graf_mouse(M_OFF,0L);
  1050.                     if(Warrow(wp,WA_DNLINE))
  1051.                     {
  1052.                         oldy--;
  1053.                     }
  1054.                     if(my<(yout+hout-2))          /* Verzögern wenn, auf Fensterrand */
  1055.                         evnt_timer(62,0);
  1056.                     else
  1057.                         if(mouse_click & 2) /* bei rechter Taste 2x */
  1058.                             for(i=0; i<HALFPAGE; i++)
  1059.                                 if(Warrow(wp,WA_DNLINE))
  1060.                                 {
  1061.                                     oldy--;
  1062.                                 }
  1063.                     graf_mouse(M_ON,0L);
  1064.                 }
  1065.                 if(wp->wfirst!=0 && mx < wp->xwork+1)
  1066.                 {
  1067.                     if(mx>xout)                    /* Verzögern wenn, auf Fensterrand */
  1068.                         evnt_timer(62,0);
  1069.                     graf_mouse(M_OFF,0L);
  1070.                     if(Warrow(wp,WA_LFLINE))
  1071.                     {
  1072.                         oldx+=HORIZ_OFFSET;
  1073.                     }
  1074.                     graf_mouse(M_ON,0L);
  1075.                 }
  1076.                 if(mx > (wp->xwork + wp->wwork))
  1077.                 {
  1078.                     if(mx<(xout+wout))          /* Verzögern wenn, auf Fensterrand */
  1079.                         evnt_timer(62,0);
  1080.                     graf_mouse(M_OFF,0L);
  1081.                     if(Warrow(wp,WA_RTLINE))
  1082.                     {
  1083.                         oldx-=HORIZ_OFFSET;
  1084.                     }
  1085.                     graf_mouse(M_ON,0L);
  1086.                 }
  1087.                 endline=oldy+wp->hfirst/wp->hscroll;        /* für zeilendifferenz */
  1088.                 wp->row=oldy;
  1089.                 wp->col=oldx;
  1090.                 wp->cstr=line;
  1091.                 Wsetrcinfo(wp);
  1092.             }
  1093.             while(mouse_click);
  1094.             evnt_button(1,1,0,&i,&i,&i,&i);
  1095.  
  1096.             for(i=0, line=wp->wstr; i<oldy && line; i++, line=line->next)
  1097.               ;
  1098.             endline=i+wp->hfirst/wp->hscroll;        /* für zeilendifferenz */
  1099.  
  1100.             ebcsave=line->begcol=0;
  1101.             (*begcut)->begcol=bbcsave;
  1102.             eecsave=line->endcol=(int)(oldx+wp->wfirst/wp->wscroll); /* letzte spalte */
  1103.             *endcut=line;                                  /* ende markieren */
  1104.  
  1105.             if(begline > endline)                        /* vertauschen */
  1106.             {
  1107. /* Das fehlte hier!!! Erik Dick */
  1108.                  lastwstr=wp->wstr;
  1109.                  lasthfirst=wp->hfirst;
  1110.  
  1111.                  line=*endcut;
  1112.                  *endcut=*begcut;
  1113.                  *begcut=line;
  1114.                    wp->cstr=*begcut;
  1115.  
  1116.                  i=endline;
  1117.                  endline=begline;
  1118.                  begline=i;
  1119.  
  1120.                  (*begcut)->begcol=eecsave;
  1121.                  (*begcut)->endcol=becsave;
  1122.                  (*endcut)->begcol=ebcsave;
  1123.                  (*endcut)->endcol=bbcsave;
  1124.             }
  1125.             if(*begcut != *endcut && begline < endline)
  1126.             {
  1127.                 (*begcut)->endcol=STRING_LENGTH;  /* Fehlerkorrektur */
  1128.             }
  1129.             if(begline==endline)
  1130.             {
  1131.                 if( (*begcut)->begcol > (*begcut)->endcol )
  1132.                 {  /* vertauschen, wenn von links nach rechts gezogen !!! */
  1133.                     (*begcut)->begcol=(*endcut)->begcol=eecsave;
  1134.                     (*begcut)->endcol=(*endcut)->endcol=becsave-1;
  1135.                 }
  1136.             }
  1137.             if((*endcut)->endcol==0)  /* wenn spalte=0, endcut zurücksetzen... */
  1138.             {
  1139.                 if(*endcut != *begcut)  /* ...wenn endcut > begcut                    */
  1140.                 {
  1141.                     *endcut=(*endcut)->prev;
  1142.                     if(*begcut != *endcut)
  1143.                         (*endcut)->begcol=0;
  1144.                     (*endcut)->endcol=STRING_LENGTH;
  1145.                     endline--;
  1146.                 }
  1147.             }
  1148.             if((*begcut)->begcol==0 && (*endcut)->endcol>=(*endcut)->used)
  1149.             {
  1150.                 endline++;
  1151.             }
  1152.             if( (*begcut)->begcol < (*begcut)->endcol &&
  1153.                  (*endcut)->begcol < (*endcut)->endcol     )
  1154.             {
  1155.                 for(line=wp->fstr; line != *begcut; line=line->next)
  1156.                 {
  1157.                     line->attr&=~SELECTED;          /* attribut löschen */
  1158.                 }
  1159.                 for(line=*begcut; line != (*endcut)->next; line=line->next)
  1160.                 {
  1161.                     line->attr|=SELECTED;          /* attribut setzen */
  1162.                 }
  1163.                 for(line=(*endcut)->next; line; line=line->next)
  1164.                 {
  1165.                     line->attr&=~SELECTED;          /* attribut löschen */
  1166.                 }
  1167.                 if(*begcut != *endcut) /* mehr als eine zeile */
  1168.                 {
  1169.                     (*begcut)->endcol=STRING_LENGTH;
  1170.                     (*endcut)->begcol=0;
  1171.                     for(line=(*begcut)->next; line && line != *endcut; line=line->next)
  1172.                     {
  1173.                         line->begcol=0;
  1174.                         line->endcol=STRING_LENGTH;
  1175.                     }
  1176.                 }
  1177.                 Wcuroff(wp);
  1178.                 graf_mouse(ARROW,0L);
  1179.                 graf_mouse(M_OFF,0L);
  1180. /*
  1181.                 wp->cstr=*endcut;
  1182. */
  1183.                 wp->cspos=wp->col=oldx;
  1184.                 wp->row=oldy;
  1185.                 Wcuroff(wp);
  1186.                 Wcursor(wp);
  1187.                 graf_mouse(M_ON,0L);
  1188.                 wind_update(END_MCTRL);
  1189.                 undo.item=FALSE;
  1190. /*
  1191. printf("\33H*%d %d %d %d %ld %ld*",x,oldx,y,oldy,begline,endline);
  1192. */
  1193. /*
  1194. printf("\33H%ld %ld",begline,endline);
  1195. */
  1196.                 return(TRUE);    /* entspricht beg_blk() + end_blk() */
  1197.             }
  1198.         }
  1199.         else /* Spaltenblockmarkierung */
  1200.         {
  1201.             x2=(mx-wp->xwork)/wp->wscroll+wp->wfirst/wp->wscroll;
  1202.             y2=(my-wp->ywork)/wp->hscroll+wp->hfirst/wp->hscroll;
  1203.  
  1204.             if(!cut && *begcut && *endcut &&
  1205.                 (int)(fx+wp->wfirst/wp->wscroll)>(*begcut)->begcol &&
  1206.                 y2>begline &&
  1207.                 (key_state & (K_RSHIFT|K_LSHIFT)))
  1208.             {                                 /* bereits vorhandenen Block erweitern */
  1209.                 lastwstr=(*begcut);
  1210.                 lasthfirst=begline*wp->hscroll;
  1211.                 fx=(*begcut)->begcol-wp->wfirst/wp->wscroll;
  1212.                 fy=begline-wp->hfirst/wp->hscroll;
  1213.                 bbcsave=line->begcol=(*begcut)->begcol;         /* erste spalte */
  1214.                 (*endcut)=line;
  1215.                 for(help=(*begcut); help!=(*endcut)->next; help=help->next)
  1216.                 {
  1217.                     help->attr|=SELECTED;
  1218.                     help->begcol=(*begcut)->begcol;
  1219.                     help->endcol=(int)(x2+wp->wfirst/wp->wscroll);
  1220.                 }
  1221.                 for(help=line->next; help; help=help->next)
  1222.                 {
  1223.                     help->attr&=~SELECTED;
  1224.                 }
  1225.                 graf_mouse(M_OFF,0L);
  1226.                 Wcursor(wp);
  1227.                 for(help=wp->wstr,i=0,y2=wp->ywork;
  1228.                      help && y2<(wp->ywork+wp->hwork-1);
  1229.                      help=help->next, i++, y2+=wp->hscroll)
  1230.                 {
  1231.                     refresh(wp,help,0,i);
  1232.                 }
  1233.                 Wcursor(wp);
  1234.                 graf_mouse(M_ON,0L);
  1235.                 graf_mkstate(&mx, &my, &mouse_click, &key_state);
  1236.                 oldx=x=(mx - wp->xwork)/wp->wscroll;
  1237.                 oldy=y=(my - wp->ywork)/wp->hscroll;
  1238.             }
  1239.             else
  1240.             {
  1241.                 if(!cut)
  1242.                     hide_blk(wp,*begcut,*endcut);
  1243.                 line->attr|=SELECTED; /* nochmal */
  1244.                 bbcsave=line->begcol=(int)(fx+wp->wfirst/wp->wscroll);    /* erste spalte */
  1245.                 (*begcut)=(*endcut)=line;                     /* blk beginn */
  1246.                 begline=y+wp->hfirst/wp->hscroll;          /* erste zeile */
  1247.             }
  1248.             graf_mouse(M_OFF,0L);
  1249.             Wcursor(wp);
  1250.             graf_mouse(M_ON,0L);
  1251.             graf_mouse(TEXT_CRSR,NULL);
  1252.             do
  1253.             {
  1254.                 x= (mx - wp->xwork) / wp->wscroll;
  1255.                 y= (my - wp->ywork) / wp->hscroll;
  1256.  
  1257.                 x=max(0,x);
  1258.                 y=max(0,y);
  1259.                 x=min(x,wp->wwork/wp->wscroll);
  1260.                 y=min(y,wp->hwork/wp->hscroll-1);
  1261.                 y=min(y,wp->hsize/wp->hscroll-1);
  1262.                 x=max(x,fx);
  1263.                 y=max(y,fy);
  1264.  
  1265.                 if(y<oldy)
  1266.                 {
  1267.                     for(i=y; i<oldy; i++)
  1268.                     {
  1269.                         line->attr^=SELECTED;
  1270.                         line=line->prev;
  1271.                         *endcut=line;
  1272.                     }
  1273.                 }
  1274.                 if(y>oldy)
  1275.                 {
  1276.                     for(i=oldy; i<y; i++)
  1277.                         if(line->next)
  1278.                         {
  1279.                             line=line->next;
  1280.                             line->attr^=SELECTED;
  1281.                             *endcut=line;
  1282.                         }
  1283.                 }
  1284.  
  1285.                 for(help=(*begcut); help!=(*endcut)->next; help=help->next)
  1286.                 {
  1287.                     help->attr|=SELECTED;
  1288.                     help->begcol=(int)(fx+wp->wfirst/wp->wscroll);
  1289.                     help->endcol=(int)( x+wp->wfirst/wp->wscroll);
  1290.                 }
  1291.  
  1292.                 if(x>=fx && y>=fy && (x!=oldx || y!=oldy))
  1293.                 {
  1294.                     pxyarray[0]=max(wp->xwork,wp->xwork+fx*wp->wscroll)+(oldx-max(0,fx))*wp->wscroll;
  1295.                     pxyarray[1]=max(wp->ywork,wp->ywork+fy*wp->hscroll)+(oldy-max(0,fy)+1)*wp->hscroll;
  1296.                     pxyarray[2]=(x-oldx)*wp->wscroll;
  1297.                     pxyarray[3]=(y-oldy)*wp->hscroll;
  1298.                     if(pxyarray[2]<0)
  1299.                     {
  1300.                         pxyarray[2]*=-1;
  1301.                         pxyarray[0]-=pxyarray[2];
  1302.                     }
  1303.                     if(pxyarray[3]<0)
  1304.                     {
  1305.                         pxyarray[3]*=-1;
  1306.                         pxyarray[1]-=pxyarray[3];
  1307.                     }
  1308.                     blackbox(wp, pxyarray, wp->wscroll);
  1309.  
  1310.                     pxyarray[0]=max(wp->xwork,wp->xwork+fx*wp->wscroll)+(oldx-max(0,fx))*wp->wscroll;
  1311.                     pxyarray[1]=max(wp->ywork,wp->ywork+fy*wp->hscroll);
  1312.                     pxyarray[2]=(x-oldx)*wp->wscroll;
  1313.                     pxyarray[3]=(oldy-max(0,fy)+1)*wp->hscroll;
  1314.                     if(pxyarray[2]<0)
  1315.                     {
  1316.                         pxyarray[2]*=-1;
  1317.                         pxyarray[0]-=pxyarray[2];
  1318.                     }
  1319.                     if(pxyarray[3]<0)
  1320.                     {
  1321.                         pxyarray[3]*=-1;
  1322.                         pxyarray[1]-=pxyarray[3];
  1323.                     }
  1324.                     blackbox(wp, pxyarray, wp->wscroll);
  1325.  
  1326.                     pxyarray[0]=max(wp->xwork,wp->xwork+fx*wp->wscroll);
  1327.                     pxyarray[1]=max(wp->ywork,wp->ywork+fy*wp->hscroll)+(oldy-max(0,fy)+1)*wp->hscroll;
  1328.                     pxyarray[2]=(oldx-max(0,fx))*wp->wscroll;
  1329.                     pxyarray[3]=(y-oldy)*wp->hscroll;
  1330.                     if(pxyarray[2]<0)
  1331.                     {
  1332.                         pxyarray[2]*=-1;
  1333.                         pxyarray[0]-=pxyarray[2];
  1334.                     }
  1335.                     if(pxyarray[3]<0)
  1336.                     {
  1337.                         pxyarray[3]*=-1;
  1338.                         pxyarray[1]-=pxyarray[3];
  1339.                     }
  1340.                     blackbox(wp, pxyarray, wp->wscroll);
  1341.  
  1342.                 }
  1343.                 oldx=x;
  1344.                 oldy=y;
  1345.                 graf_mkstate(&mx, &my, &mouse_click, &key_state);
  1346.  
  1347.                 if(my < wp->ywork)
  1348.                 {
  1349.                     graf_mouse(M_OFF,0L);
  1350.                     if(Warrow(wp,WA_UPLINE))
  1351.                     {
  1352.                         fy++;
  1353.                         oldy++;
  1354.                     }
  1355.                     if(my>yout)                    /* Verzögern wenn, auf Fensterrand */
  1356.                         evnt_timer(62,0);
  1357.                     else
  1358.                         if(mouse_click & 2) /* bei rechter Taste 2x */
  1359.                             for(i=0; i<HALFPAGE; i++)
  1360.                                 if(Warrow(wp,WA_UPLINE))
  1361.                                 {
  1362.                                     fy++;
  1363.                                     oldy++;
  1364.                                 }
  1365.                     graf_mouse(M_ON,0L);
  1366.                 }
  1367.                 if(my > (wp->ywork + wp->hwork))
  1368.                 {
  1369.                     graf_mouse(M_OFF,0L);
  1370.                     if(Warrow(wp,WA_DNLINE))
  1371.                     {
  1372.                         fy--;
  1373.                         oldy--;
  1374.                     }
  1375.                     if(my<(yout+hout-2))          /* Verzögern wenn, auf Fensterrand */
  1376.                         evnt_timer(62,0);
  1377.                     else
  1378.                         if(mouse_click & 2) /* bei rechter Taste 2x */
  1379.                             for(i=0; i<HALFPAGE; i++)
  1380.                                 if(Warrow(wp,WA_DNLINE))
  1381.                                 {
  1382.                                     fy--;
  1383.                                     oldy--;
  1384.                                 }
  1385.                     graf_mouse(M_ON,0L);
  1386.                 }
  1387.                 if(mx < wp->xwork+1)
  1388.                 {
  1389.                     if(mx>xout)                    /* Verzögern wenn, auf Fensterrand */
  1390.                         evnt_timer(62,0);
  1391.                     graf_mouse(M_OFF,0L);
  1392.                     if(Warrow(wp,WA_LFLINE))
  1393.                     {
  1394.                         fx+=HORIZ_OFFSET;
  1395.                         oldx+=HORIZ_OFFSET;
  1396.                     }
  1397.                     graf_mouse(M_ON,0L);
  1398.                 }
  1399.                 if(mx > (wp->xwork + wp->wwork))
  1400.                 {
  1401.                     if(mx<(xout+wout))          /* Verzögern wenn, auf Fensterrand */
  1402.                         evnt_timer(62,0);
  1403.                     graf_mouse(M_OFF,0L);
  1404.                     if(Warrow(wp,WA_RTLINE))
  1405.                     {
  1406.                         fx-=HORIZ_OFFSET;
  1407.                         oldx-=HORIZ_OFFSET;
  1408.                     }
  1409.                     graf_mouse(M_ON,0L);
  1410.                 }
  1411.                 endline=oldy+wp->hfirst/wp->hscroll;        /* für zeilendifferenz */
  1412.                 wp->row=oldy;
  1413.                 wp->col=oldx;
  1414.                 wp->cstr=line;
  1415.                 Wsetrcinfo(wp);
  1416.             }
  1417.             while(mouse_click);
  1418.             evnt_button(1,1,0,&i,&i,&i,&i);
  1419.             endline=oldy+wp->hfirst/wp->hscroll;          /* letzte zeile */
  1420.  
  1421.             for(line=wp->fstr; line && line!=(*begcut); line=line->next)
  1422.             {
  1423.                 line->attr &=~SELECTED;
  1424.                 line->begcol=0;
  1425.                 line->endcol=STRING_LENGTH;
  1426.             }
  1427.             for(i=begline, line=*begcut;
  1428.                 i<=endline && line;
  1429.                 i++, line=line->next)
  1430.             {
  1431.                 line->attr |=SELECTED;
  1432.                 line->begcol=(int)(fx+wp->wfirst/wp->wscroll);
  1433.                 line->endcol=(int)(oldx+wp->wfirst/wp->wscroll);
  1434.                 *endcut=line;
  1435.             }
  1436.             for(line=(*endcut)->next; line; line=line->next)
  1437.             {
  1438.                 line->attr &=~SELECTED;
  1439.                 line->begcol=0;
  1440.                 line->endcol=STRING_LENGTH;
  1441.             }
  1442.             if(abs(fx-oldx))
  1443.             {
  1444.                 Wcuroff(wp);
  1445.                 graf_mouse(ARROW,0L);
  1446.                 graf_mouse(M_OFF,0L);
  1447.                 wp->cstr=*endcut;
  1448.                 wp->cspos=wp->col=oldx;
  1449.                 wp->row=oldy;
  1450.                 Wcuroff(wp);
  1451.                 Wcursor(wp);
  1452.                 graf_mouse(M_ON,0L);
  1453.                 wind_update(END_MCTRL);
  1454.                 undo.item=FALSE;
  1455.                 return(TRUE);    /* entspricht beg_blk() + end_blk() */
  1456.             }
  1457.         }
  1458.         wind_update(END_MCTRL);
  1459.     }
  1460.     *begcut=*endcut=NULL;
  1461.     *searchstring=0;
  1462.  
  1463.     graf_mouse(ARROW,0L);
  1464.  
  1465.     graf_mouse(M_OFF,0L);
  1466.     Wcursor(wp);
  1467.     graf_mouse(M_ON,0L);
  1468.     return(FALSE);
  1469. }
  1470.  
  1471. long _keyoff(void);
  1472. long _keyon(void);
  1473.  
  1474. static void get_key(WINDOW *wp, int *mx, int *my,  int *key_state)
  1475. {
  1476.    int event;
  1477.  
  1478.     static MEVENT mevent=
  1479.     {
  1480.         MU_KEYBD|MU_TIMER,
  1481.         0,0,0,
  1482.         0,0,0,0,0,
  1483.         0,0,0,0,0,
  1484.         NULL,
  1485.         0L,
  1486.         0,0,0,0,0,0,
  1487.     /* nur der Vollständigkeit halber die Variablen von XGEM */
  1488.         0,0,0,0,0,
  1489.         0,
  1490.         0L,
  1491.         0L,0L
  1492.     };
  1493.  
  1494.     Supexec(_keyon);
  1495.  
  1496.    event = evnt_event(&mevent);
  1497.  
  1498.     Supexec(_keyoff);
  1499.  
  1500.    *key_state = 0;
  1501.       MapKey(&mevent.e_ks,&mevent.e_kr); /* Profibuch Seite 761 */
  1502.    if(event & MU_KEYBD)
  1503.    {
  1504.       switch(mevent.e_kr)
  1505.       {
  1506.             case 0x8648:     /* shiftctrl up */
  1507.                *my -= wp->hscroll;
  1508.                break;
  1509.             case 0x8650:    /* shiftctrl dn */
  1510.                *my += wp->hscroll;
  1511.                break;
  1512.             case 0x864B:     /* shiftctrl left  */
  1513.             case 0x8673:
  1514.                *mx -= wp->wscroll;
  1515.                 wp->cspos--; /* festen Cursor beim Scrollen 9.4.94 */
  1516.                break;
  1517.             case 0x864D:     /* shiftctrl right */
  1518.             case 0x8674:
  1519.                *mx += wp->wscroll;
  1520.                 wp->cspos++;
  1521.                break;
  1522.       }
  1523. /* muß raus, wg. Makrorecorder
  1524.         while(evnt_event(&mevent) == MU_KEYBD)
  1525.             ;
  1526. */
  1527.       mx=max(0,mx);
  1528.       mx=min(mx,xdesk+wdesk);
  1529.       my=max(0,my);
  1530.       my=min(my,ydesk+hdesk);
  1531.    }
  1532.    *key_state = mevent.e_ks;
  1533. }
  1534.  
  1535. int _WKeyBlock(WINDOW *wp, LINESTRUCT **begcut, LINESTRUCT **endcut, int key_state, int key)
  1536. {
  1537.     int ret,fx,fy,x,y,x2,oldx,oldy,pxyarray[4];
  1538.     int mx,my,mouse_click,wordmark=FALSE,linemark=FALSE;
  1539.     int bbcsave,becsave,ebcsave,eecsave;
  1540.     register LINESTRUCT *line,*help;
  1541.     int xout,yout,wout,hout;
  1542.     long i,y2,temp;
  1543.  
  1544.    /* folgende Tasten müssen alternativ gedrückt sein: */
  1545.    if(!((key == 0x8648) ||      /* shiftctrl up */
  1546.           (key == 0x8650) ||   /* shiftctrl dn */
  1547.           (key == 0x864B) ||     /* shiftctrl left  */
  1548.           (key == 0x864D) ||
  1549.           (key == 0x8673) ||
  1550.           (key == 0x8674)))    /* shiftctrl right  */
  1551.         return(FALSE);
  1552.  
  1553.     if(wp)
  1554.     {
  1555.                           /* bei gedrückter Shifttaste Block erweitern */
  1556.         if(!cut && !(key_state & (K_RSHIFT|K_LSHIFT|K_CTRL)))
  1557.             hide_blk(wp,*begcut,*endcut);
  1558.         if(cut)                    /* gibt es erst noch müll zu löschen */
  1559.             free_blk(wp,*begcut);
  1560.  
  1561.         wind_calc(WC_BORDER,wp->kind,wp->xwork,wp->ywork,wp->wwork,wp->hwork,
  1562.             &xout,&yout,&wout,&hout);
  1563.  
  1564.       /* Cursorposition umrechnen in Pixeln */
  1565.         mx=wp->xwork + wp->col*wp->wscroll;
  1566.         my=wp->ywork + wp->row*wp->hscroll;
  1567.  
  1568.         x=(mx-wp->xwork)/wp->wscroll;
  1569.         fx=oldx=x;
  1570.         fy=oldy=y=(my-wp->ywork)/wp->hscroll;
  1571.  
  1572.         for(i=0, line=wp->wstr; i<y && line; i++, line=line->next)
  1573.           ;
  1574.  
  1575.         lastwstr=wp->wstr;
  1576.         lasthfirst=wp->hfirst;
  1577.  
  1578.         if(!(wp->w_state&COLUMN))
  1579.         {
  1580.             oldx=x=min(x,line->used-wp->wfirst/wp->wscroll);
  1581.             y2=(my-wp->ywork)/wp->hscroll+wp->hfirst/wp->hscroll;
  1582.             
  1583.             if(!cut && *begcut && *endcut && (key_state & (K_RSHIFT|K_LSHIFT|K_CTRL)))
  1584.             {
  1585.                 if((y2 > (begline+(endline-begline)/2)) ||
  1586.                     ((y2 == (begline+(endline-begline)/2)) && x>((*begcut)->begcol-wp->wfirst/wp->wscroll)))
  1587.                 {  /* bereits vorhandenen Block nach unten erweitern */
  1588.                     lastwstr=(*begcut);
  1589.                     lasthfirst=begline*wp->hscroll;
  1590.                     (*begcut)->endcol=STRING_LENGTH;
  1591.                     for(help=(*begcut)->next; help && help!=line->next; help=help->next)
  1592.                     {
  1593.                         help->attr|=SELECTED;
  1594.                         help->begcol=0;
  1595.                         help->endcol=STRING_LENGTH;
  1596.                     }
  1597.                     for(help=line->next; help; help=help->next)
  1598.                     {
  1599.                         help->attr&=~SELECTED;
  1600.                     }
  1601.                     bbcsave=(*begcut)->begcol;    /* erste spalte */
  1602.                     becsave=line->endcol=min(line->used,(int)(x+wp->wfirst/wp->wscroll));
  1603.                     pxyarray[0]=wp->xwork;
  1604.                     pxyarray[1]=wp->ywork+(min(y2,endline)*wp->hscroll)-wp->hfirst;
  1605.                     pxyarray[2]=wp->wwork;
  1606.                     pxyarray[3]=(abs(y2-endline)+1)*wp->hscroll;
  1607.                 }
  1608.                 else
  1609.                 {  /* bereits vorhandenen Block nach oben erweitern */
  1610.                     lastwstr=wp->wstr;
  1611.                     lasthfirst=wp->hfirst;
  1612.                     bbcsave=becsave=(*endcut)->endcol;
  1613.                     becsave++;
  1614.                     *begcut=*endcut;
  1615.                     (*begcut)->begcol=0;
  1616.                     (*begcut)->endcol=bbcsave;
  1617.                     *endcut=line;
  1618.                     (*endcut)->begcol=min(line->used,(int)(x+wp->wfirst/wp->wscroll));
  1619.                     (*endcut)->endcol=STRING_LENGTH;
  1620.                     temp=begline;
  1621.                     begline=endline;
  1622.                     for(help=wp->fstr; help && help!=line; help=help->next)
  1623.                     {
  1624.                         help->attr&=~SELECTED;
  1625.                     }
  1626.                     for(help=(*endcut); help && help!=(*begcut); help=help->next)
  1627.                     {
  1628.                         help->attr|=SELECTED;
  1629.                         help->begcol=0;
  1630.                         help->endcol=STRING_LENGTH;
  1631.                     }
  1632.                     for(help=(*begcut)->next; help; help=help->next)
  1633.                     {
  1634.                         help->attr&=~SELECTED;
  1635.                     }
  1636.                     (*endcut)->begcol=min(line->used,(int)(x+wp->wfirst/wp->wscroll));
  1637.                     (*begcut)->endcol=bbcsave;
  1638.                     pxyarray[0]=wp->xwork;
  1639.                     pxyarray[1]=wp->ywork+(min(y2,temp)*wp->hscroll)-wp->hfirst;
  1640.                     pxyarray[2]=wp->wwork;
  1641.                     pxyarray[3]=(abs(y2-temp)+1)*wp->hscroll;
  1642.                 }
  1643.                 graf_mouse(M_OFF,0L);
  1644.                 Wcursor(wp);
  1645.                 Wredraw(wp,pxyarray);
  1646.                 Wcursor(wp);
  1647.                 graf_mouse(M_ON,0L);
  1648.             }
  1649.             else
  1650.             {
  1651.                 if(!cut)
  1652.                     hide_blk(wp,*begcut,*endcut);
  1653.                 line->attr|=SELECTED; /* nochmal */
  1654.                 bbcsave=line->begcol=(int)(x+wp->wfirst/wp->wscroll);    /* erste spalte */
  1655.                 becsave=line->endcol=(int)(x+wp->wfirst/wp->wscroll+1);
  1656.                 *begcut=line;                                     /* blk beginn */
  1657.                 begline=y+wp->hfirst/wp->hscroll;          /* erste zeile */
  1658.             }
  1659.             graf_mouse(M_OFF,0L);
  1660.             Wcursor(wp);
  1661.             graf_mouse(M_ON,0L);
  1662.  
  1663.           switch(key) /* Cursor gleich um eins weitersetzen, */
  1664.           {                /* damit sofort ein Block entsteht         */
  1665.                 case 0x8648:     /* shiftctrl up */
  1666.                    my -= wp->hscroll;
  1667.                    break;
  1668.                 case 0x8650:    /* shiftctrl dn */
  1669.                    my += wp->hscroll;
  1670.                    break;
  1671.                 case 0x864B:     /* shiftctrl left  */
  1672.                 case 0x8673:
  1673.                    mx -= wp->wscroll;
  1674.                    wp->cspos--; /* festen Cursor beim Scrollen 9.4.94 */
  1675.                    break;
  1676.                 case 0x864D:     /* shiftctrl right */
  1677.                 case 0x8674:
  1678.                    mx += wp->wscroll;
  1679.                    wp->cspos++;
  1680.                    break;
  1681.           }
  1682.           mx=max(0,mx);
  1683.           mx=min(mx,xdesk+wdesk);
  1684.           my=max(0,my);
  1685.           my=min(my,ydesk+hdesk);
  1686.  
  1687.             do
  1688.             {
  1689.                 x=(mx - wp->xwork) / wp->wscroll;
  1690.                 y=(my - wp->ywork) / wp->hscroll;
  1691.  
  1692.                 x=max(x,wp->cspos-wp->wfirst/wp->wscroll);
  1693.                 x=min(x,line->used-wp->wfirst/wp->wscroll);
  1694.  
  1695.                 /* nicht weiter als bis ans Zeilenende */
  1696.                 mx=min(mx, wp->xwork + x*wp->wscroll);
  1697.  
  1698.                 x=max(0,x);
  1699.                 y=max(0,y);
  1700.                 x=min(x,wp->wwork/wp->wscroll-1);
  1701.                 y=min(y,wp->hwork/wp->hscroll-1);
  1702.                 y=min(y,wp->hsize/wp->hscroll-1);
  1703.                 
  1704.                 if(y < oldy)
  1705.                 {
  1706.                     for(i=y; i<oldy; i++)
  1707.                     {
  1708.                         if(line->prev)
  1709.                         {
  1710.                             if(line==*begcut)                  /* Blockbeginn */
  1711.                             {
  1712.                                 line->begcol=0;
  1713.                                 line->endcol=bbcsave;
  1714.                                 line=line->prev;
  1715.                                 line->attr|=SELECTED;
  1716.                                 line->begcol=(int)(x+(int)(wp->wfirst/wp->wscroll));
  1717.                                 line->endcol=STRING_LENGTH;
  1718.                             }
  1719.                             else
  1720.                             {
  1721.                                 if(line->prev->attr & SELECTED)    /* hinter Bb zurück */
  1722.                                 {
  1723.                                     line->attr&=~SELECTED;
  1724.                                     line=line->prev;
  1725.                                     if(line==*begcut)         /* jetzt am Bb */
  1726.                                     {
  1727.                                         line->begcol=bbcsave;
  1728.                                         line->endcol=(int)(x+(int)(wp->wfirst/wp->wscroll));
  1729.                                         if(line->begcol>line->endcol)
  1730.                                             swap(&line->begcol,&line->endcol);
  1731.                                     }
  1732.                                     else
  1733.                                     {
  1734.                                         line->begcol=0;
  1735.                                         line->endcol=(int)(x+(int)(wp->wfirst/wp->wscroll));
  1736.                                     }
  1737.                                 }
  1738.                                 else                              /* vor Bb zurück */
  1739.                                 {
  1740.                                     line->begcol=0;
  1741.                                     line->endcol=STRING_LENGTH;
  1742.                                     line=line->prev;
  1743.                                     line->attr|=SELECTED;
  1744.                                     line->begcol=(int)(x+(int)(wp->wfirst/wp->wscroll));
  1745.                                     line->endcol=STRING_LENGTH;
  1746.                                 }
  1747.                             }
  1748.                         }
  1749.                     }
  1750.                 }
  1751.                 if(y > oldy)
  1752.                 {
  1753.                     for(i=oldy; i<y; i++)
  1754.                     {
  1755.                         if(line->next)
  1756.                         {
  1757.                             if(line==*begcut) /* Blockbeginn */
  1758.                             {
  1759.                                 line->begcol=bbcsave;
  1760.                                 line->endcol=STRING_LENGTH;
  1761.                                 line=line->next;
  1762.                                 line->attr|=SELECTED;
  1763.                                 line->begcol=0;
  1764.                                 line->endcol=(int)(x+(int)(wp->wfirst/wp->wscroll));
  1765.                             }
  1766.                             else
  1767.                             {
  1768.                                 if(line->next->attr & SELECTED)  /* vor Blockbeginn */
  1769.                                 {
  1770.                                     line->attr&=~SELECTED;
  1771.                                     line=line->next;
  1772.                                     if(line==*begcut)        /* jetzt am Bb */
  1773.                                     {
  1774.                                         line->begcol=bbcsave;
  1775.                                         line->endcol=(int)(x+(int)(wp->wfirst/wp->wscroll));
  1776.                                         if(line->begcol>line->endcol)
  1777.                                             swap(&line->begcol,&line->endcol);
  1778.                                     }
  1779.                                     else                         /* immer noch vor Bb */
  1780.                                     {
  1781.                                         line->begcol=(int)(x+(int)(wp->wfirst/wp->wscroll));
  1782.                                         line->endcol=STRING_LENGTH;
  1783.                                     }
  1784.                                 }
  1785.                                 else                             /* nach Blockbeginn */
  1786.                                 {
  1787.                                     line->begcol=0;
  1788.                                     line->endcol=STRING_LENGTH;
  1789.                                     line=line->next;
  1790.                                     line->attr|=SELECTED;
  1791.                                     line->begcol=0;
  1792.                                     line->endcol=(int)(x+(int)(wp->wfirst/wp->wscroll));
  1793.                                 }
  1794.                             }
  1795.                         }
  1796.                     }
  1797.                 }
  1798.                 if(y < oldy)
  1799.                 {
  1800.                     if(x>=oldx)
  1801.                     {
  1802.                         pxyarray[0]=wp->xwork + x * wp->wscroll;
  1803.                         pxyarray[1]=wp->ywork + y * wp->hscroll;
  1804.                         pxyarray[2]=wp->wwork;
  1805.                         pxyarray[3]=abs(oldy - y) * wp->hscroll;
  1806.                         blackbox(wp, pxyarray, wp->wscroll);
  1807.                         pxyarray[0]=wp->xwork;
  1808.                         pxyarray[1]=wp->ywork + (y+1) * wp->hscroll;
  1809.                         pxyarray[2]=oldx * wp->wscroll;
  1810.                         pxyarray[3]=abs(oldy- y) * wp->hscroll;
  1811.                         blackbox(wp, pxyarray, wp->wscroll);
  1812.                     }
  1813.                     else /* kleiner */
  1814.                     {
  1815.                         pxyarray[0]=wp->xwork + oldx * wp->wscroll;
  1816.                         pxyarray[1]=wp->ywork + y * wp->hscroll;
  1817.                         pxyarray[2]=wp->wwork;
  1818.                         pxyarray[3]=abs(oldy - y) * wp->hscroll;
  1819.                         blackbox(wp, pxyarray, wp->wscroll);
  1820.                         pxyarray[0]=wp->xwork;
  1821.                         pxyarray[1]=wp->ywork + (y+1) * wp->hscroll;
  1822.                         pxyarray[2]=x * wp->wscroll;
  1823.                         pxyarray[3]=abs(oldy- y) * wp->hscroll;
  1824.                         blackbox(wp, pxyarray, wp->wscroll);
  1825.                     }
  1826.                 }
  1827.                 if(y > oldy)
  1828.                 {
  1829.                     if(x >= oldx)
  1830.                     {
  1831.                         pxyarray[0]=wp->xwork + x * wp->wscroll;
  1832.                         pxyarray[1]=wp->ywork + oldy * wp->hscroll;
  1833.                         pxyarray[2]=wp->wwork;
  1834.                         pxyarray[3]=abs(y - oldy) * wp->hscroll;
  1835.                         blackbox(wp, pxyarray, wp->wscroll);
  1836.                         pxyarray[0]=wp->xwork;
  1837.                         pxyarray[1]=wp->ywork + (oldy + 1) * wp->hscroll;
  1838.                         pxyarray[2]=oldx * wp->wscroll;
  1839.                         pxyarray[3]=abs(y - oldy) * wp->hscroll;
  1840.                         blackbox(wp, pxyarray, wp->wscroll);
  1841.                     }
  1842.                     else /* kleiner */
  1843.                     {
  1844.                         pxyarray[0]=wp->xwork + oldx * wp->wscroll;
  1845.                         pxyarray[1]=wp->ywork + oldy * wp->hscroll;
  1846.                         pxyarray[2]=wp->wwork;
  1847.                         pxyarray[3]=abs(y - oldy) * wp->hscroll;
  1848.                         blackbox(wp, pxyarray, wp->wscroll);
  1849.                         pxyarray[0]=wp->xwork;
  1850.                         pxyarray[1]=wp->ywork + (oldy + 1) * wp->hscroll;
  1851.                         pxyarray[2]=x * wp->wscroll;
  1852.                         pxyarray[3]=abs(y - oldy) * wp->hscroll;
  1853.                         blackbox(wp, pxyarray, wp->wscroll);
  1854.                     }
  1855.                 }
  1856.                 if(x > oldx)
  1857.                 {
  1858.                     if(y>=oldy)
  1859.                     {
  1860.                         pxyarray[0]=wp->xwork + oldx * wp->wscroll;
  1861.                         pxyarray[1]=wp->ywork + oldy * wp->hscroll;
  1862.                         pxyarray[2]=abs(x - oldx) * wp->wscroll;
  1863.                         pxyarray[3]=(abs(y - oldy)+1) * wp->hscroll;
  1864.                         blackbox(wp, pxyarray, wp->wscroll);
  1865.                     }
  1866.                     else
  1867.                     {
  1868.                         pxyarray[0]=wp->xwork + oldx * wp->wscroll;
  1869.                         pxyarray[1]=wp->ywork + (y+1) * wp->hscroll;
  1870.                         pxyarray[2]=abs(x - oldx) * wp->wscroll;
  1871.                         pxyarray[3]=(abs(y - oldy)-1) * wp->hscroll;
  1872.                         blackbox(wp, pxyarray, wp->wscroll);
  1873.                     }
  1874.                 }
  1875.                 if(x < oldx)
  1876.                 {
  1877.                     if(y==oldy)
  1878.                     {
  1879.                         pxyarray[0]=wp->xwork + x * wp->wscroll;
  1880.                         pxyarray[1]=wp->ywork + y * wp->hscroll;
  1881.                         pxyarray[2]=abs(oldx - x) * wp->wscroll;
  1882.                         pxyarray[3]=wp->hscroll;
  1883.                         blackbox(wp, pxyarray, wp->wscroll);
  1884.                     }
  1885.                     if(y>oldy)
  1886.                     {
  1887.                         pxyarray[0]=wp->xwork + x * wp->wscroll;
  1888.                         pxyarray[1]=wp->ywork + (oldy+1) * wp->hscroll;
  1889.                         pxyarray[2]=abs(oldx - x) * wp->wscroll;
  1890.                         pxyarray[3]=(abs(oldy - y)-1) * wp->hscroll;
  1891.                         blackbox(wp, pxyarray, wp->wscroll);
  1892.                     }
  1893.                     if(y<oldy)
  1894.                     {
  1895.                         pxyarray[0]=wp->xwork + x * wp->wscroll;
  1896.                         pxyarray[1]=wp->ywork + y * wp->hscroll;
  1897.                         pxyarray[2]=abs(x - oldx) * wp->wscroll;
  1898.                         pxyarray[3]=(abs(y - oldy)+1) * wp->hscroll;
  1899.                         blackbox(wp, pxyarray, wp->wscroll);
  1900.                     }
  1901.                 }
  1902.                 oldx=x;
  1903.                 oldy=y;
  1904.                 get_key(wp, &mx, &my, &key_state);
  1905.                 if(my < wp->ywork)
  1906.                 {
  1907.                     graf_mouse(M_OFF,0L);
  1908.                     if(Warrow(wp,WA_UPLINE))
  1909.                     {
  1910.                         oldy++;
  1911.                         my += wp->hscroll;
  1912.                     }
  1913.                     graf_mouse(M_ON,0L);
  1914.                 }
  1915.                 if(my > (wp->ywork + wp->hwork))
  1916.                 {
  1917.                     graf_mouse(M_OFF,0L);
  1918.                     if(Warrow(wp,WA_DNLINE))
  1919.                     {
  1920.                         oldy--;
  1921.                         my -= wp->hscroll;
  1922.                     }
  1923.                     graf_mouse(M_ON,0L);
  1924.                 }
  1925.                 if(wp->wfirst!=0 && mx < wp->xwork+1)
  1926.                 {
  1927.                     graf_mouse(M_OFF,0L);
  1928.                     if(Warrow(wp,WA_LFLINE))
  1929.                     {
  1930.                         oldx+=HORIZ_OFFSET;
  1931.                         mx += wp->wscroll;
  1932.                     }
  1933.                     graf_mouse(M_ON,0L);
  1934.                 }
  1935.                 if(mx > (wp->xwork + wp->wwork))
  1936.                 {
  1937.                     graf_mouse(M_OFF,0L);
  1938.                     if(Warrow(wp,WA_RTLINE))
  1939.                     {
  1940.                         oldx-=HORIZ_OFFSET;
  1941.                         mx -= wp->wscroll;
  1942.                     }
  1943.                     graf_mouse(M_ON,0L);
  1944.                 }
  1945.                 endline=oldy+wp->hfirst/wp->hscroll;        /* für zeilendifferenz */
  1946.                 wp->row=oldy;
  1947.                 wp->col=oldx;
  1948.                 wp->cstr=line;
  1949.                 Wsetrcinfo(wp);
  1950.             }
  1951.             while(key_state & (K_RSHIFT|K_LSHIFT|K_CTRL));
  1952.  
  1953.             for(i=0, line=wp->wstr; i<oldy && line; i++, line=line->next)
  1954.               ;
  1955.             endline=i+wp->hfirst/wp->hscroll;        /* für zeilendifferenz */
  1956.  
  1957.             ebcsave=line->begcol=0;
  1958.             (*begcut)->begcol=bbcsave;
  1959.             eecsave=line->endcol=(int)(oldx+wp->wfirst/wp->wscroll); /* letzte spalte */
  1960.             *endcut=line;                                  /* ende markieren */
  1961.  
  1962.             if(begline > endline)                        /* vertauschen */
  1963.             {
  1964. /* Das fehlte hier!!! Erik Dick */
  1965.                  lastwstr=wp->wstr;
  1966.                  lasthfirst=wp->hfirst;
  1967.  
  1968.                  line=*endcut;
  1969.                  *endcut=*begcut;
  1970.                  *begcut=line;
  1971.                    wp->cstr=*begcut;
  1972.  
  1973.                  i=endline;
  1974.                  endline=begline;
  1975.                  begline=i;
  1976.  
  1977.                  (*begcut)->begcol=eecsave;
  1978.                  (*begcut)->endcol=becsave;
  1979.                  (*endcut)->begcol=ebcsave;
  1980.                  (*endcut)->endcol=bbcsave;
  1981.             }
  1982.             if(*begcut != *endcut && begline < endline)
  1983.             {
  1984.                 (*begcut)->endcol=STRING_LENGTH;  /* Fehlerkorrektur */
  1985.             }
  1986.             if(begline==endline)
  1987.             {
  1988.                 if( (*begcut)->begcol > (*begcut)->endcol )
  1989.                 {  /* vertauschen, wenn von links nach rechts gezogen !!! */
  1990.                     (*begcut)->begcol=(*endcut)->begcol=eecsave;
  1991.                     (*begcut)->endcol=(*endcut)->endcol=becsave-1;
  1992.                 }
  1993.             }
  1994.             if((*endcut)->endcol==0)  /* wenn spalte=0, endcut zurücksetzen... */
  1995.             {
  1996.                 if(*endcut != *begcut)  /* ...wenn endcut > begcut                    */
  1997.                 {
  1998.                     *endcut=(*endcut)->prev;
  1999.                     if(*begcut != *endcut)
  2000.                         (*endcut)->begcol=0;
  2001.                     (*endcut)->endcol=STRING_LENGTH;
  2002.                     endline--;
  2003.                 }
  2004.             }
  2005.             if((*begcut)->begcol==0 && (*endcut)->endcol>=(*endcut)->used)
  2006.             {
  2007.                 endline++;
  2008.             }
  2009.             if( (*begcut)->begcol < (*begcut)->endcol &&
  2010.                  (*endcut)->begcol < (*endcut)->endcol     )
  2011.             {
  2012.                 for(line=wp->fstr; line != *begcut; line=line->next)
  2013.                 {
  2014.                     line->attr&=~SELECTED;          /* attribut löschen */
  2015.                 }
  2016.                 for(line=*begcut; line != (*endcut)->next; line=line->next)
  2017.                 {
  2018.                     line->attr|=SELECTED;          /* attribut setzen */
  2019.                 }
  2020.                 for(line=(*endcut)->next; line; line=line->next)
  2021.                 {
  2022.                     line->attr&=~SELECTED;          /* attribut löschen */
  2023.                 }
  2024.                 if(*begcut != *endcut) /* mehr als eine zeile */
  2025.                 {
  2026.                     (*begcut)->endcol=STRING_LENGTH;
  2027.                     (*endcut)->begcol=0;
  2028.                     for(line=(*begcut)->next; line && line != *endcut; line=line->next)
  2029.                     {
  2030.                         line->begcol=0;
  2031.                         line->endcol=STRING_LENGTH;
  2032.                     }
  2033.                 }
  2034.                 Wcuroff(wp);
  2035.                 graf_mouse(ARROW,0L);
  2036.                 graf_mouse(M_OFF,0L);
  2037. /*
  2038.                 wp->cstr=*endcut;
  2039. */
  2040.                 wp->cspos=wp->col=oldx;
  2041.                 wp->row=oldy;
  2042.                 Wcuroff(wp);
  2043.                 Wcursor(wp);
  2044.                 graf_mouse(M_ON,0L);
  2045.                 undo.item=FALSE;
  2046. /*
  2047. printf("\33H*%d %d %d %d %ld %ld*",x,oldx,y,oldy,begline,endline);
  2048. */
  2049.                 return(TRUE);    /* entspricht beg_blk() + end_blk() */
  2050.             }
  2051.         }
  2052.         else /* Spaltenblockmarkierung */
  2053.         {
  2054.             x2=(mx-wp->xwork)/wp->wscroll+wp->wfirst/wp->wscroll;
  2055.             y2=(my-wp->ywork)/wp->hscroll+wp->hfirst/wp->hscroll;
  2056.  
  2057.             if(!cut && *begcut && *endcut &&
  2058.                 (int)(fx+wp->wfirst/wp->wscroll)>(*begcut)->begcol &&
  2059.                 y2>begline &&
  2060.                 (key_state & (K_RSHIFT|K_LSHIFT|K_CTRL)))
  2061.             {                                 /* bereits vorhandenen Block erweitern */
  2062.                 lastwstr=(*begcut);
  2063.                 lasthfirst=begline*wp->hscroll;
  2064.                 fx=(*begcut)->begcol-wp->wfirst/wp->wscroll;
  2065.                 fy=begline-wp->hfirst/wp->hscroll;
  2066.                 bbcsave=line->begcol=(*begcut)->begcol;         /* erste spalte */
  2067.                 (*endcut)=line;
  2068.                 for(help=(*begcut); help!=(*endcut)->next; help=help->next)
  2069.                 {
  2070.                     help->attr|=SELECTED;
  2071.                     help->begcol=(*begcut)->begcol;
  2072.                     help->endcol=(int)(x2+wp->wfirst/wp->wscroll);
  2073.                 }
  2074.                 for(help=line->next; help; help=help->next)
  2075.                 {
  2076.                     help->attr&=~SELECTED;
  2077.                 }
  2078.                 graf_mouse(M_OFF,0L);
  2079.                 Wcursor(wp);
  2080.                 for(help=wp->wstr,i=0,y2=wp->ywork;
  2081.                      help && y2<(wp->ywork+wp->hwork-1);
  2082.                      help=help->next, i++, y2+=wp->hscroll)
  2083.                 {
  2084.                     refresh(wp,help,0,i);
  2085.                 }
  2086.                 Wcursor(wp);
  2087.                 graf_mouse(M_ON,0L);
  2088.                 graf_mkstate(&mx, &my, &mouse_click, &key_state);
  2089.                 oldx=x=(mx - wp->xwork)/wp->wscroll;
  2090.                 oldy=y=(my - wp->ywork)/wp->hscroll;
  2091.             }
  2092.             else
  2093.             {
  2094.                 if(!cut)
  2095.                     hide_blk(wp,*begcut,*endcut);
  2096.                 line->attr|=SELECTED; /* nochmal */
  2097.                 bbcsave=line->begcol=(int)(fx+wp->wfirst/wp->wscroll);    /* erste spalte */
  2098.                 (*begcut)=(*endcut)=line;                     /* blk beginn */
  2099.                 begline=y+wp->hfirst/wp->hscroll;          /* erste zeile */
  2100.             }
  2101.             graf_mouse(M_OFF,0L);
  2102.             Wcursor(wp);
  2103.             graf_mouse(M_ON,0L);
  2104.  
  2105.           switch(key) /* Cursor gleich um eins weitersetzen, */
  2106.           {                /* damit sofort ein Block entsteht         */
  2107. /* nein
  2108.                 case 0x8648:     /* shiftctrl up */
  2109.                    my -= wp->hscroll;
  2110.                    break;
  2111. */
  2112.                 case 0x8650:    /* shiftctrl dn */
  2113.                    my += wp->hscroll;
  2114.                    break;
  2115. /* nein
  2116.                 case 0x864B:     /* shiftctrl left  */
  2117.                 case 0x8673:
  2118.                    mx -= wp->wscroll;
  2119.                    break;
  2120. */
  2121.                 case 0x864D:     /* shiftctrl right */
  2122.                 case 0x8674:
  2123.                    mx += wp->wscroll;
  2124.                    break;
  2125.           }
  2126.           mx=max(0,mx);
  2127.           mx=min(mx,xdesk+wdesk);
  2128.           my=max(0,my);
  2129.           my=min(my,ydesk+hdesk);
  2130.  
  2131.             do
  2132.             {
  2133.                 x= (mx - wp->xwork) / wp->wscroll;
  2134.                 y= (my - wp->ywork) / wp->hscroll;
  2135.  
  2136.                 x=max(0,x);
  2137.                 y=max(0,y);
  2138.                 x=min(x,wp->wwork/wp->wscroll);
  2139.                 y=min(y,wp->hwork/wp->hscroll-1);
  2140.                 y=min(y,wp->hsize/wp->hscroll-1);
  2141.                 x=max(x,fx);
  2142.                 y=max(y,fy);
  2143.  
  2144.                 if(y<oldy)
  2145.                 {
  2146.                     for(i=y; i<oldy; i++)
  2147.                     {
  2148.                         line->attr^=SELECTED;
  2149.                         line=line->prev;
  2150.                         *endcut=line;
  2151.                     }
  2152.                 }
  2153.                 if(y>oldy)
  2154.                 {
  2155.                     for(i=oldy; i<y; i++)
  2156.                         if(line->next)
  2157.                         {
  2158.                             line=line->next;
  2159.                             line->attr^=SELECTED;
  2160.                             *endcut=line;
  2161.                         }
  2162.                 }
  2163.  
  2164.                 for(help=(*begcut); help!=(*endcut)->next; help=help->next)
  2165.                 {
  2166.                     help->attr|=SELECTED;
  2167.                     help->begcol=(int)(fx+wp->wfirst/wp->wscroll);
  2168.                     help->endcol=(int)( x+wp->wfirst/wp->wscroll);
  2169.                 }
  2170.  
  2171.                 if(x>=fx && y>=fy && (x!=oldx || y!=oldy))
  2172.                 {
  2173.                     pxyarray[0]=max(wp->xwork,wp->xwork+fx*wp->wscroll)+(oldx-max(0,fx))*wp->wscroll;
  2174.                     pxyarray[1]=max(wp->ywork,wp->ywork+fy*wp->hscroll)+(oldy-max(0,fy)+1)*wp->hscroll;
  2175.                     pxyarray[2]=(x-oldx)*wp->wscroll;
  2176.                     pxyarray[3]=(y-oldy)*wp->hscroll;
  2177.                     if(pxyarray[2]<0)
  2178.                     {
  2179.                         pxyarray[2]*=-1;
  2180.                         pxyarray[0]-=pxyarray[2];
  2181.                     }
  2182.                     if(pxyarray[3]<0)
  2183.                     {
  2184.                         pxyarray[3]*=-1;
  2185.                         pxyarray[1]-=pxyarray[3];
  2186.                     }
  2187.                     blackbox(wp, pxyarray, wp->wscroll);
  2188.  
  2189.                     pxyarray[0]=max(wp->xwork,wp->xwork+fx*wp->wscroll)+(oldx-max(0,fx))*wp->wscroll;
  2190.                     pxyarray[1]=max(wp->ywork,wp->ywork+fy*wp->hscroll);
  2191.                     pxyarray[2]=(x-oldx)*wp->wscroll;
  2192.                     pxyarray[3]=(oldy-max(0,fy)+1)*wp->hscroll;
  2193.                     if(pxyarray[2]<0)
  2194.                     {
  2195.                         pxyarray[2]*=-1;
  2196.                         pxyarray[0]-=pxyarray[2];
  2197.                     }
  2198.                     if(pxyarray[3]<0)
  2199.                     {
  2200.                         pxyarray[3]*=-1;
  2201.                         pxyarray[1]-=pxyarray[3];
  2202.                     }
  2203.                     blackbox(wp, pxyarray, wp->wscroll);
  2204.  
  2205.                     pxyarray[0]=max(wp->xwork,wp->xwork+fx*wp->wscroll);
  2206.                     pxyarray[1]=max(wp->ywork,wp->ywork+fy*wp->hscroll)+(oldy-max(0,fy)+1)*wp->hscroll;
  2207.                     pxyarray[2]=(oldx-max(0,fx))*wp->wscroll;
  2208.                     pxyarray[3]=(y-oldy)*wp->hscroll;
  2209.                     if(pxyarray[2]<0)
  2210.                     {
  2211.                         pxyarray[2]*=-1;
  2212.                         pxyarray[0]-=pxyarray[2];
  2213.                     }
  2214.                     if(pxyarray[3]<0)
  2215.                     {
  2216.                         pxyarray[3]*=-1;
  2217.                         pxyarray[1]-=pxyarray[3];
  2218.                     }
  2219.                     blackbox(wp, pxyarray, wp->wscroll);
  2220.  
  2221.                 }
  2222.                 oldx=x;
  2223.                 oldy=y;
  2224.                 get_key(wp, &mx, &my, &key_state);
  2225.  
  2226.                 if(my < wp->ywork)
  2227.                 {
  2228.                     graf_mouse(M_OFF,0L);
  2229.                     if(Warrow(wp,WA_UPLINE))
  2230.                     {
  2231.                         fy++;
  2232.                         oldy++;
  2233.                         my += wp->hscroll;
  2234.                     }
  2235.                     graf_mouse(M_ON,0L);
  2236.                 }
  2237.                 if(my > (wp->ywork + wp->hwork))
  2238.                 {
  2239.                     graf_mouse(M_OFF,0L);
  2240.                     if(Warrow(wp,WA_DNLINE))
  2241.                     {
  2242.                         fy--;
  2243.                         oldy--;
  2244.                         my -= wp->hscroll;
  2245.                     }
  2246.                     graf_mouse(M_ON,0L);
  2247.                 }
  2248.                 if(mx < wp->xwork+1)
  2249.                 {
  2250.                     graf_mouse(M_OFF,0L);
  2251.                     if(Warrow(wp,WA_LFLINE))
  2252.                     {
  2253.                         fx+=HORIZ_OFFSET;
  2254.                         oldx+=HORIZ_OFFSET;
  2255.                         mx += wp->wscroll;
  2256.                     }
  2257.                     graf_mouse(M_ON,0L);
  2258.                 }
  2259.                 if(mx > (wp->xwork + wp->wwork))
  2260.                 {
  2261.                     graf_mouse(M_OFF,0L);
  2262.                     if(Warrow(wp,WA_RTLINE))
  2263.                     {
  2264.                         fx-=HORIZ_OFFSET;
  2265.                         oldx-=HORIZ_OFFSET;
  2266.                         mx -= wp->wscroll;
  2267.                     }
  2268.                     graf_mouse(M_ON,0L);
  2269.                 }
  2270.                 endline=oldy+wp->hfirst/wp->hscroll;        /* für zeilendifferenz */
  2271.                 wp->row=oldy;
  2272.                 wp->col=oldx;
  2273.                 wp->cstr=line;
  2274.                 Wsetrcinfo(wp);
  2275.             }
  2276.             while(key_state & (K_RSHIFT|K_LSHIFT|K_CTRL));
  2277.             endline=oldy+wp->hfirst/wp->hscroll;          /* letzte zeile */
  2278.  
  2279.             for(line=wp->fstr; line && line!=(*begcut); line=line->next)
  2280.             {
  2281.                 line->attr &=~SELECTED;
  2282.                 line->begcol=0;
  2283.                 line->endcol=STRING_LENGTH;
  2284.             }
  2285.             for(i=begline, line=*begcut;
  2286.                 i<=endline && line;
  2287.                 i++, line=line->next)
  2288.             {
  2289.                 line->attr |=SELECTED;
  2290.                 line->begcol=(int)(fx+wp->wfirst/wp->wscroll);
  2291.                 line->endcol=(int)(oldx+wp->wfirst/wp->wscroll);
  2292.                 *endcut=line;
  2293.             }
  2294.             for(line=(*endcut)->next; line; line=line->next)
  2295.             {
  2296.                 line->attr &=~SELECTED;
  2297.                 line->begcol=0;
  2298.                 line->endcol=STRING_LENGTH;
  2299.             }
  2300.             if(abs(fx-oldx))
  2301.             {
  2302.                 Wcuroff(wp);
  2303.                 graf_mouse(ARROW,0L);
  2304.                 graf_mouse(M_OFF,0L);
  2305.                 wp->cstr=*endcut;
  2306.                 wp->cspos=wp->col=oldx;
  2307.                 wp->row=oldy;
  2308.                 Wcuroff(wp);
  2309.                 Wcursor(wp);
  2310.                 graf_mouse(M_ON,0L);
  2311.                 undo.item=FALSE;
  2312.                 return(TRUE);    /* entspricht beg_blk() + end_blk() */
  2313.             }
  2314.         }
  2315.     }
  2316.     *begcut=*endcut=NULL;
  2317.     *searchstring=0;
  2318.  
  2319.     graf_mouse(ARROW,0L);
  2320.  
  2321.     graf_mouse(M_OFF,0L);
  2322.     Wcursor(wp);
  2323.     graf_mouse(M_ON,0L);
  2324.     return(FALSE);
  2325. }
  2326.  
  2327.